tan*_*dem 5 python linux jvm elasticsearch
我正在启动的java进程是Elasticsearch,它创建了许多线程.我检查一下使用ps HuH p <pid> | wc -l.这就是我如何获得elasticsearch的pid:
ES=`jps | egrep 'Elasticsearch' | awk '{print $1}'`
Run Code Online (Sandbox Code Playgroud)
我使用以下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)
Run Code Online (Sandbox Code Playgroud)
但是,当我查看top -H -p <pid>并监控核心分配时.它大部分时间都不服从.这里有什么我想念的吗?JVM必须在这里做点什么吗?
有没有其他方法可以将线程固定到核心?
小智 0
taskset将正常工作。然而,如果一个进程处于睡眠状态,它当前的CPU将不会切换到新的CPU。
cat /proc/<PID>/status | grep State:
Run Code Online (Sandbox Code Playgroud)
要解决这个问题,你可以这样做
kill -SIGSTOP <PID>
kill -SIGCONT <PID>
Run Code Online (Sandbox Code Playgroud)
这会强制进程退出睡眠状态并确保 CPU 切换。top或htop将正确显示该值。
| 归档时间: |
|
| 查看次数: |
458 次 |
| 最近记录: |