man 7 time可以看见
High-Resolution Timers
Before Linux 2.6.21, the accuracy of timer and sleep system calls (see below) was also limited by the size of the jiffy.
Since Linux 2.6.21, Linux supports high-resolution timers (HRTs), optionally configurable via CONFIG_HIGH_RES_TIMERS. On a system that supports HRTs, the
accuracy of sleep and timer system calls is no longer constrained by the jiffy, but instead can be as accurate as the hardware allows (microsecond accu-
racy is typical of modern hardware).
内核启动时的禁用方法
highres= [KNL] Enable/disable high resolution timer mode.
Valid parameters: "on", "off"
Default: "on"
顺便,linux所有内核启动参数可以在当前内核源代码的下的
Documentation/kernel-parameters.txt文件中
cat /proc/cmdline
可以查看当前内核启动参数
我帖子里的问题应该可以通过禁用这个来解决
.............经过测试,这个参数能确实解决sleep占用高的问题,物理真机测试cpu占用直接从160%降到0。
但是,这个参数在云服务器(虚拟机)上是没有效果的,我之前在腾讯服务器上测试就没效果。
原因估计是因为云服务器的真机启动的时候没有highres=off,所以虚拟机内核使用这个参数实际是无效的。
顺便可以用调试工具跟踪下
pstack可以查看程序函数堆栈
strace可以跟踪进程/线程的系统调用
ltrace显示程序调用的动态库函数(注意这个会重启进程,一般都应该在程序启动前ltrace)
strace最好先通过top -H -p pid找到进程的所有线程的pid号,然后用strace追踪最高cpu消耗的线程
然后strace -T -tt -e trace=all -p
最好不要加-f不然打印都集中看不完。
偷来的翻译
一、常用参数
-c:统计每种系统调用执行的时间、调用次数、出错次数,程序退出时给出报告
-p pid:跟踪指定的进程,可以使用多个-p同时跟踪多个进程
-o filename:starce默认将结果输出到标准输出即stdout,-o可以将结果输出到指定的文件中
-f:跟踪由fork产生的子进程的系统调用
-ff:常与-o选项一起使用,不同进程(子进程)产生的系统调用结果输出到各个filename.pid文件中
-F:尝试跟踪vfork子进程系统调用,需要注意的是,如果与-f选项同时使用时,vfork不被跟踪
-e expr:输出过滤表达式,可以过滤掉不想输出的strace结果
-e trace=set:指定跟踪set中的系统调用
-e trace=network:跟踪与网络有关的所有系统调用
-e strace=signal:跟踪与系统信号有关的所有系统调用
-e trace=ipc:跟踪与进程通讯有关的所有系统调用
-e signal=set:指定跟踪set中的信号
-e read=set:输出从指定文件中读出的数据,比如-e read=3,5
-e write=set:输出写入到指定文件中的数据,比如-e write=1
-r:打印每一个系统调用的相对时间
-t:在输出中的每一行前加上时间信息,时间精确到秒级
-tt:在输出中的每一行前加上时间信息,时间精确到微秒级
-ttt:在输出中的每一行前加上时间信息,输出为相对时间
-s:指定每一行输出字符串的长度(默认是32)
阅读(5323) | 评论(0) | 转发(0) |