在 linux 上,我发现识别进程上下文切换的最可靠方法是通过以下命令:
pidstat -hluwrt | grep "processname"
'tid' 列 (#3) 与 'gettid()' 相同,因此允许开发人员直接关联哪个线程正在使用 CPU 和上下文切换。我建议在为程序生成线程时吐出 gettid() 值:printf("%lul",gettid())。
进程命令行之前的最后 2 列是每秒的“cswtch/s”(自愿)和“nvcswtch/s”(非自愿)上下文切换计数。
当“cswtch/s”很高(1000 秒)时,您的进程正在过度循环通过“唤醒”和“睡眠”。您可能需要考虑某种缓冲区来提供线程,从而允许更长的唤醒和睡眠时间。例如:当缓冲区未满时,线程休眠时间更长。当缓冲区变满时,线程处于唤醒状态,直到缓冲区变空。
当“nvswtch/s”很高(1000 秒)时,这表明您的系统负载很重,并且各个线程正在争用 CPU 时间。您可能想调查服务器负载、服务器上活动进程和线程的数量:“top”或“htop”是您的朋友。
我发现以下脚本对调试/优化进程线程很有用(每 20 秒输出一次):
stdbuf -oL pidstat -hluwrt 20 | stdbuf -oL grep -e "processname" -e "^#"
gettid 的文档:( 此处
的文档) pidstat 的文档:(此处
的
文档) stdbuf 的文档:( 此处的文档)