经常有小伙伴们在公众号中询问:在VPP环境中如何打印系统时间?由于VPP通常避免直接调用libc函数库,这个问题确实让人头疼。不过,在研究了mactime插件的代码之后,我们发现了解决办法——通过使用vppinfra/time_range模块来实现系统时间的打印功能。
Vppinfra 提供了高精度、低成本的计时服务:相关数据类型 clib_time_t 及其配套函数可以在 ./src/vppinfra/time.[ch] 文件中找到。要初始化 clib_time_t 对象,请调用 clib_time_init(&clib_time_t对象)。函数 clib_time_now() 可以返回自 VPP 启动以来的秒数,并且保证该计时是单调递增的,即使系统参考时钟发生变化也不会受到影响。(曾经有小伙伴问我,调整系统的时间,会影响到vpp的调度时间吗?这里就解答了,不影响)。
在time_range.[ch]文件中提供了获取系统时间函数接口,在单元测试插件unittest中有文件plugins/unittest/mactime_test.c有相应的学习案例。核心代码如下所示:
/* 初始化时间基线,默认是UST-5时间*/
clib_timebase_init (tb, -5 /* EST */ , CLIB_TIMEBASE_DAYLIGHT_USA,
&vm->clib_time);
/* 设置夏令时缓存 */
now = clib_timebase_now (tb);
/* 打印当前系统时间 */
fformat (stdout, "Current time in UTC%f, US daylight time rules:\n",
tb->timezone_offset / 3600.0);
fformat (stdout, "%U", format_clib_timebase_time, now);
默认情况下,插件unittest是未使能的状态,我们可以在启动配置文件startup.conf文件plugins配置项中设置{plugin unittest_plugin.so { enable }}来使能,可以使用命令行test time-range来测试上面的函数。测试结果如下:
dpdk-vpp源码分析: test time-range
Current time in UTC-5, US daylight time rules:
Wed, 25 Sep 2024 22:44:17 -> Wed, 25 Sep 2024 22:44:17
Test daylight time rules:
Thu, 24 Oct 2024 22:32:59 should not be in DST, and it is
Thu, 24 Oct 2024 22:33:01 should be in DST, and it is
Sun, 06 Nov 2011 01:59:59 should be in DST, and it is
Sun, 06 Nov 2011 02:00:01 should not be in DST, and it is not
Test time range calculations:
Sunday midnight: Sun, 22 Sep 2024 00:00:00
range: Mon, 23 Sep 2024 11:00:00 - Mon, 23 Sep 2024 17:00:00
range: Tue, 24 Sep 2024 07:00:00 - Tue, 24 Sep 2024 11:00:00
range: Wed, 25 Sep 2024 08:00:00 - Wed, 25 Sep 2024 18:00:00
range: Thu, 26 Sep 2024 08:00:00 - Thu, 26 Sep 2024 18:00:00
range: Fri, 27 Sep 2024 08:00:00 - Fri, 27 Sep 2024 18:00:00
默认情况下,打印时间显示EST时间, 即 Eastern Standard Time(东部标准时间)的缩写。这是美国东部时区的标准时间,其时区为 UTC-5:00,即比国际协调时间(UTC)慢5小时。北京时间(CST)是 UTC+8,意味着比 UTC 快 8 小时。
但是测试中发现UTC-5时间和使用linux date命令查询的时间满了12个小时,理论上应该是13的小时。所以怀疑实际上默认输出的EDT时间,东部时区改为 EDT(Eastern Daylight Time,东部夏令时,UTC-4)。所以我们可以在时间基线初始化时调整时区差异时间为7小时。
clib_timebase_init (tb, 7 /* EST */ , CLIB_TIMEBASE_DAYLIGHT_USA,
&vm->clib_time);
测试结果如下,和系统时间一致:
root@learning-vpp:~/workspace/vpp# date
Wed Sep 25 10:16:30 PM CST 2024
root@learning-vpp:~/workspace/vpp# vppctl test time-range
Current time in UTC7, US daylight time rules:
Wed, 25 Sep 2024 22:16:43 -> Wed, 25 Sep 2024 22:16:4
本文分享自 DPDK VPP源码分析 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!