前几天尝试修改了Linux kernel把实时线程收到timer interrupt频率降低成了一天一次(Linux如何对一个核完全屏蔽timer interrupt?),在测试观察阶段我重点关注了获取系统时间戳的性能,发现clock_gettime
延时比预期的高。
后来发现这个问题和改内核无关,是个Linux上普遍存在的问题:我在不同硬件配置和系统设置Linux服务器或PC上做了测试,发现clock_gettime
延时经常高于100 ns,且十分不稳定(范围在20 ~ 1000 ns)。这对于需要记录时间戳的实时系统或一个用时间戳做性能测试的普通程序来说都不是一个好消息。
然后,我简单看了下Linux timekeeping和clock_gettime VDSO的实现,觉得在user space实现同样精确且和系统严格对时的纳秒级时间戳是可行的。于是尝试实现了下,发现效果符合预期:获取纳秒时间戳的延时可以稳定在10 ns左右(所有工作在8条连续的CPU指令内完成,且没有函数调用)。项目链接:https://github.com/MengRao/tscns,具体细节可以看README,欢迎大家试用并提出反馈。
最后插一句题外话,我为什么有空搞这些乱七八糟的东西?因为单身狗就是有时间呐。。。求妹子,坐标上海。。。