注意linux 2.6.32
内核高精度定时器带来的cpu sy暴涨的“问题,根据
http://hellojava.info/?m=201307所说的:
linux在2.6.32内核以后支持了高精度的调度,在.32以前的内核里,即使你在java里写queue.await(1ns)之类的代码,其实都是需要1ms左右才会执行的,但.32以后则可以支持ns级的调度,对于实时性要求非常非常高的性能而言,这本来是个好特性。
但不幸的是很多人在
写代码的时候其实压根就没有要ns级调度的需求,纯粹只是随便写了一个类似10ns唤醒的策略,这个在内核升级到.32后就悲催了,直接就会看到cpu sy猛增,很容易以为是内核的bug,话说其实这可以认为是程序本身的bug。
在linux上可通过cat /proc/timer_list | grep .resolution来查看调度器的精度。
可通过修改/boot/grub/grub.conf,在相应的kernel行的最后增加highres=off nohz=off来关闭高精度(不建议这样做,最好还是程序本身做相应的修改)。