我正在启动的Java进程是Elasticsearch,它创建了许多线程。我使用 ps HuH p <pid> | wc -l
来检查它们。
这是我获取Elasticsearch pid的方法:
ES=`jps | egrep 'Elasticsearch' | awk '{print $1}'`
我使用以下python脚本将给定pid的所有线程固定到一组核心上。
#!/usr/bin/env python
import os
import argparse
def task_set(pid, core):
print "pinning all threads of pid: ", pid, " to cores: ", core
os.system('taskset -apc '+str(core)+' ' +str(pid)+' >/dev/null')
def main(args):
experiments = ["1B", "2B", "1B3S", "2B2S", "1S", "2S", "3S", "4S"]
which = args.id[0]
idx = experiments.index(which)
PC = ["0", "0,1", "0,2,3,4", "0,1,2,3", "2", "2,3","2,3,4", "2,3,4,5"]
task_set(args.pid[0], PC[idx])
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--pid', nargs=1, help='appid')
parser.add_argument('--id', nargs=1, help='core')
args = parser.parse_args()
main(args)
然而,当我使用命令top -H -p <pid>
查看并监控核心分配时,大部分时间它并不遵循规定。
这里有什么我漏掉的吗?JVM需要在这方面做些什么吗?
还有其他方法可以将线程钉在核心上吗?
taskset
命令是否有效,如果有效,则调试Python脚本。 - apangintaskset
命令中的a
参数是用来做什么的?我的 Linux 发行版没有这个参数。在man
中也没有看到它。 - apangintaskset
对我来说很好用。你能澄清一下你运行的命令以及如何检查它是否无法工作吗? - apangintop
来验证进程亲和性。如果taskset
在没有 CPU 列表参数的情况下调用并打印出预期的绑定,则我会认为脚本已成功。 - apangin