首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TimeRange:轻松转换系统时间的高效接口库

TimeRange:轻松转换系统时间的高效接口库

作者头像
dpdk-vpp源码解读
发布2024-11-23 08:28:14
发布2024-11-23 08:28:14
22400
代码可运行
举报
文章被收录于专栏:DPDK VPP源码分析DPDK VPP源码分析
运行总次数:0
代码可运行

经常有小伙伴们在公众号中询问:在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有相应的学习案例。核心代码如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
/* 初始化时间基线,默认是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来测试上面的函数。测试结果如下:

代码语言:javascript
代码运行次数:0
运行
复制
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小时。

代码语言:javascript
代码运行次数:0
运行
复制
clib_timebase_init (tb, 7 /* EST */ , CLIB_TIMEBASE_DAYLIGHT_USA,
          &vm->clib_time);

测试结果如下,和系统时间一致:

代码语言:javascript
代码运行次数:0
运行
复制
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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档