【问题标题】:Set CPU affinity for a Java process when started from Eclipse [duplicate]从 Eclipse 启动时为 Java 进程设置 CPU 亲和性 [重复]
【发布时间】:2017-01-21 10:19:31
【问题描述】:

有些第三方库会出于许可目的检查 CPU 计数,但没有明确的方式告诉他们“使用 1 个内核”。

为了绕过这个限制,我希望能够在此过程的早期启动 CPU 亲和性。

有没有办法为从 Eclipse 中启动的进程设置 CPU 亲和性?我想保持工作流程相对相同,这意味着我仍然希望能够调试等。

如果这是唯一的解决方案,我可以修改程序,但我更喜欢依赖 JVM 选项或 Eclipse 运行程序参数的解决方案。

【问题讨论】:

  • 这有点令人费解。 You likely can't do it without JNI,但真的令人费解的是我怀疑你在做什么;鉴于大多数现代服务器都超过 16 个,为什么您的代码库依赖于检查每个内核的许可证?
  • 这是哪个操作系统?
  • @Makoto “为什么你的代码库依赖于检查每个内核的许可证”第一句话。这不是“我的代码库”——我无法控制的 3rd 方库的代码库。谢谢你的链接,我去看看。
  • @thatotherguy Windows。但最好知道如何在 Linux 中执行此操作。
  • @levantpied 愚蠢的问题:这些商业库是否会检查 used 运行它们的核心数量,或运行 available 的核心数量他们?我问是因为我使用的所有商业软件都是后者(通过系统调用),我希望你的库就是这种情况,然后简单地限制它们只使用一种护理可能无法解决你的许可问题。

标签: java eclipse


【解决方案1】:

看起来像这样:

How to use Java Native Access to set process affinity for processes besides Java.exe?

至少为 Windows 提供了问题本身的解决方案。复制到这里供后人参考:

   private void setDesiredCpuAffinity() {
      int pid = -1; // -1 means current process
      AffinityKernel instance = (AffinityKernel) Native.loadLibrary("Kernel32", AffinityKernel.class);
      int affinityMask = 7; // Use 3 CPUs
      System.out.println(instance.SetProcessAffinityMask(new HANDLE(new Pointer(pid)), affinityMask));
   }

   private static interface AffinityKernel extends Kernel32 {
      public boolean SetProcessAffinityMask(HANDLE hProcess, int dwProcessAffinityMask);
   }

根据这个:

SetProcessAffinityMask的第一个参数是HANDLE hProcess

根据这个:

hProcess = -1 表示当前进程。

【讨论】:

    猜你喜欢
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2013-03-05
    相关资源
    最近更新 更多