作者Spig (Spig)
看板LinuxDev
标题Re: [问题] 想请教关於Linux抓取时间会乱跳的问题
时间Thu Jan 22 21:32:16 2009
※ 引述《asoedarren (天真岁月阳仲寿)》之铭言:
: ※ [本文转录自 Linux 看板]
: 作者: asoedarren (天真岁月阳仲寿) 看板: Linux
: 标题: [问题] 想请教关於Linux抓取时间会乱跳的问题
: 时间: Thu Jan 22 20:16:04 2009
: 我的server程式在centos上
: 不管使用time() 或是gettimeofday函式 只要过一段时间就会往後跳
: 例如 前几次抓到依序是 100000 100001 100002 突然会跳到106801 (数字只是举例)
: 造成程式误判为timeout或是写入log档时间不定 请问有前辈遇过类似的问题吗?
: 另外程式会不定期吃掉system loading 如图 http://rapidpik.com/show/28829/nf5tc
: 但很神奇的是又不是吃到满 如果是全蓝还可以解释是server程式loading过重,
: 那条线出现的时候,会出现集体断线,以及client很难再连线的情形,
: 如果程式重启会恢复,如果不管他过一阵子也会恢复,但不一定多久,可能几小时,
: 现在怀疑跟上面那个问题有关系,不知道前辈有何看法。
: Server在国外,很难重灌,不知道有没有解决的办法。 感谢。
是在 x86 的 processor 上吗?
我有遇到过, 不过是在某个 ARM 的 SoC 上
Linux kernel 里的最小计时单位是 jiffies, 一般都是 100Hz (10ms)
若是需要更精确的单位 (ex:gettimeofday()拿到的ns), 则依頼硬体的 timer
他的做法是每次 timer interrupt 来的时候, jiffies + 1, 并且 reset h/w timer
若是有人呼叫 gettimeofday(), 则去看一下 h/w timer 跑到那里, 跟现在的 jiffies
就能算出较精确的时间...
若是遇到时间回跳的情形, 多半都是 h/w timer 在 10ms 中间就算完, 并且自行 reset
解法有二种:
1. 治本: 确认一下 Kernel source 里的 arch/xxx/mach-xxx/time.c 里面算法是对的
2. 治标: gettimeofday() 後算时间差的时候, 遇到负值时暂时跳过, 等下一轮再处理
如果你回跳的程度超过一个 jiffies (10ms)
那请检查一下是不是有 process 在 settimeofday(), 像是 ntp client 之类的
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.170.12.115
1F:→ asoedarren:谢谢 我再试试 01/23 18:22