编程思维-同样的程序换个启动者就变慢了
部门新研发的上线系统,有个daemon,负责复制文件,并启动进程。有个业务使用新系统发现,只要是用新系统上线,请求耗时增加20%-50%,手动重启后耗时恢复。显然,和启动者是上线系统的daemon有关,因为在什么都不变的情况下,只是重启进程,就能恢复。
1 对比正常和异常进程
使用top对比cpu、内存占用率,两者没有差异,但是发现NI(nice)不同。正常进程的NI为0,异常的为-19。于是 renice -n 0 <pid>
恢复NI,但是耗时并未恢复。
排查daemon程序,发现它启动时,把自己的nice设为-19。(我觉得作者本意是想设置为19,避免上线进程影响正常业务,但是设错了)。因为业务进程是它启动的,子进程继承父进程的nice也为-19。于是把daemon程序的nice设置取消,并重启,然后重新上线业务,耗时正常。
说明是nice的原因,可为啥手动renice运行中的进程不行呢?因为renice并不会改变子进程(线程)的值,改用 renice -n 0 <pgid>
恢复NI,耗时也能恢复。
除了top,用 ps -eL -o ni,pid,pgid,cmd
也可以查看nice的值。
2 反直觉的nice
nice的含义是进程调度优先级,nice值越低,调度优先级越高。 但是为啥调度优先级越高,程序反而变慢了呢? 应该和多线程有关。最好的策略是别动这个值。如果想让程序变快,改它没用(使用新系统的业务很多,反映业务变快的一个没有,变慢的倒是有)。一定要改,对比测试看效果后再改。