我正在读书这个链接刚才这让我开始思考。
不久前,我在 32 核虚拟机的多达 30 个核心上启动模拟,并使用一个调用nohup perl ...<rest of command>...
并重定向 STOUT/STDERR 的包装器脚本来实现这一点 - 我不确定具体细节是否相关,所以我会备用你详细信息。
从概念上讲,我对多线程任务处理很满意,但我天真地认为,在 nohup 调用中对每个进程进行后台处理(每个进程都是一个单独的模拟,然后运行几周),足以将每个子进程放置到一个核心/线程上它自己的,然后继续完成,而不需要 GNU Parallels 或其他东西。
我定期检查它们,总是看到 30 个 vCPU 正在处理任务,一切都在合理的时间内完成,所以到目前为止我的逻辑似乎没有任何问题......
有人(我认为在某个页面上)告诉我这可能最终会导致“CPU 抖动”。
所以我的问题有几个相互关联的部分:
- 首先,我错误地认为 nohup 和/或 backgrounding 足以将进程坚持到特定核心上吗?(并且在特定核心上运行的进程可以在终端中显示吗?Top 只告诉你哪些核心很忙,而不是据我所知它们正在执行什么任务?)
- 其次,即使有 2 个备用 CPU 可以处理系统其他任务,CPU 抖动也会发生吗?
- 最后,如果我没记错的话,给定的进程是否会固定到特定的 CPU,并且只有那个CPU,或者它们会根据调用顺序/计时等在线程之间跳转。即,如果我循环遍历文件,第一个文件是否会固定到 CPU 0,然后是 1、2 等等,直到完成?
答案1
首先,我是否错误地假设 nohup 和/或后台是在终端中显示的特定核心上运行的进程? Top 只告诉您哪些核心正忙,而不是据我所知它们正在执行什么任务?)足以将进程粘在特定核心上吗? (并且可以
Nohup 运行命令的方式与没有运行命令时完全相同,唯一的区别是它们从 pid 列表中删除,以便在退出时向其发送信号。 (disown 适用于未使用 nohup 启动的进程)。
其次,即使有 2 个备用 CPU 可以处理系统其他任务,CPU 抖动也会发生吗?
仅当在没有 nohup 的情况下发生 CPU 抖动时...
最后,如果我没有错的话,给定的进程是否会固定到特定的CPU,并且只有该CPU,或者它们会根据调用顺序/计时等在线程之间跳转。即,如果我循环遍历文件,第一个进程会被固定到一个特定的CPU上吗?一个被固定到 CPU 0,然后是 1、2 等等,直到完成?
和没有 nohup 一样...
您可以使用 ps 查看进程正在哪个 cpu 核心上运行,并且可以使用任务集限制或更改对核心的限制。
ps -eo pid,sgi_p,cmd --sort sgi_p
taskset -c -p 0 1234
答案2
nohup
没有设置任何东西来在特定核心上保留进程。你通常会使用taskset
一起nohup
做那件事。top
可以显示进程最后调度在哪个核心上,它就是P
列。
多年来,进程和线程调度变得相当复杂,因为需要考虑的因素越来越多:CPU 亲和性、缓存亲和性、中断处理、功率包络……但如果您假设系统不太忙于其他任务,则启动的作业数量少于可用核心的数量。以类似的方式,您无法真正预测任务将在哪个 CPU 上运行,但如果合适,调度程序很可能在选择核心后将其保留在同一核心上。