将java线程固定到核心

时间:2016-03-08 15:31:44

标签: python linux elasticsearch jvm

我正在启动的java进程是Elasticsearch,它创建了许多线程。 我使用ps HuH p <pid> | wc -l检查了一下。 这就是我如何得到弹性搜索的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是否必须在此处执行某些操作?

还有其他方法可以将线程固定到核心上吗?

1 个答案:

答案 0 :(得分:0)

taskset将正常工作。但是,如果一个进程处于“睡眠”状态,则它的当前CPU将不会切换到新的CPU。

cat /proc/<PID>/status | grep State:

要解决此问题,您可以

kill -SIGSTOP <PID>
kill -SIGCONT <PID>

这将使进程退出睡眠状态并确保CPU切换。 tophtop将正确显示该值。