mips平台下使用jiffies_to_msecs差值计算rtt不准确问题

3 篇文章 0 订阅

我们业务模块实现了rtt计算机制,通过发送探测request时,使用jiffies_to_msecs(jiffies)记录下发送时间值。收到探测reply时,再使用jiffies_to_msecs(jiffies)记录下接收时间值。作差得到实时的rtt值。后续还会计算平滑srtt值。

该机制在x86平台一直运行正常。最近在mips平台上出现了问题。
业务模块统计出来的延时为0ms。实际抓包查看发现延时在7ms左右。明显业务模块统计错误。

相同代码,在不同平台表现不一样。这是怎么回事?
突然想到,我们使用的是jiffies_to_msecs(jiffies)来记录时间值的。而jiffies的更新受HZ配置影响,也就是每1/HZ 秒jiffies更新一次。HZ是编译时通过CONFIG_HZ选项设置的。

从源码查看CONFIG_HZ配置:

[root@localhost ~]$ grep -w CONFIG_HZ .config
CONFIG_HZ=100

HZ=100,也就是每10ms更新一次。假如发送request和接收reply时间间隔小于10ms,那么两次调用jiffies_to_msecs时的jiffies还没更新,是相同的值。作差会得到0ms的rtt。导致rtt计算不准确。

因为在mips平台使用ping命令得到的延时都是准确的,所以我们可以参考ping命令使用的计时方法。
ping命令使用的是gettimeofday,对应内核的do_gettimeofday。通过获取timekeeping获取到更精准的当前时间。

于是将业务模块的计时实现改为了

{
	struct timeval tv = {0, 0};
	do_gettimeofday(&tv);
	return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}

修改后验证通过,能够正确计算出毫秒级的延时。

综合比较:
jiffies_to_msecs : 处理精度低,但是执行效率高。
do_gettimeofday: 处理精度高,但是执行效率较低。

需根据实际需求择优使用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮沉飘摇

码字不易,打赏随意。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值