linux如何使cpu保持最佳,我们如何在Linux中使用sleep()来保持CPU的合理使用率,同时又有不错的计时精度呢?...

问题

我正在测试一个使用UDP包以预定速率通信的系统。我希望能够使用Python测试工具和一个固定的包速率来测试这个系统。采样率可能是20包/秒,或4500包/秒,等等

在一些简单的测试中,我确定我的Windows机器可以通过本地主机每秒传送150000个UDP数据包,所以为了实验起见,我可以将其视为上限。在

让我们从这个shell结构开始创建一个速率限制器。这段代码的灵感主要来自this thread中的代码。在

方法1import time, timeit

class RateLimiter:

def __init__(self, rate_limit):

self.min_interval = 1.0 / float(rate_limit)

self.last_time_called = None

def execute(self, func, *args, **kwargs):

if self.last_time_called is not None:

# Sleep until we should wake up

while True:

now = timeit.default_timer()

elapsed = now - self.last_time_called

left_to_wait = self.min_interval - elapsed

if left_to_wait <= 0:

break

time.sleep(left_to_wait)

self.last_time_called = timeit.default_timer()

return func(*args, **kwargs)

你可以像这样使用这个类:

^{pr2}$

对timeit.default_timer()的调用是Python中的一个快捷方式,它为您的平台提供了最高精度的计时器,在Windows和Linux上都提供了大约1e-6秒的精确度,这是我们需要的。在

方法1的性能

在这种方法中,sleep()可以在不占用CPU周期的情况下为您赢得时间,但它会损害延迟的准确性。This comment显示了Windows和Linux在小于10ms的时间段内sleep()的区别。总之,Windows的sleep()只适用于1ms或更大的值(任何小于等于零),但通常睡眠时间小于请求的睡眠时间,而在Linux中,sleep()更精确,但通常睡眠时间比请求的时间稍长一些。在

上面的代码在我的Windows机器上是准确的,但是对于更快的速率来说效率很低。当我在测试中请求4500包/秒的速率时,我得到的中值是4466包/秒(0.75%的错误)。然而,,对于高于1000Hz的速率,调用sleep()的时间为零,因此速率限制器消耗CPU周期,直到超过等待时间。不幸的是,我们没有其他选择,因为我们不能在Windows中使用小于1ms的非零睡眠时间。在

在Linux中,调用sleep()的时间比请求的长,产生的平均值为3470包/秒(22.8%的错误)。虽然Linux中的sleep()比预期的要长,但是请求更高的速率(如6000Hz)会产生高于4500的真实速率,因此我们知道它能够达到目标速率。问题出在我们的sleep()值中,必须将其更正为低于我们预期的值。使用另一种方法(I)执行了另一种方法。在

方法2

在这种方法中,我们从不睡觉。我们消耗CPU周期直到时间流逝,这导致Python 100%地使用它运行的内核:def execute(self, func, *args, **kwargs):

if self.last_time_called is not None:

# Sleep until we should wake up

while True:

now = timeit.default_timer()

elapsed = now - self.last_time_called

left_to_wait = self.min_interval - elapsed

if left_to_wait <= 0:

break

# (sleep removed from here)

self.last_time_called = timeit.default_timer()

return func(*args, **kwargs)

方法2的性能

在Linux中,这会产生4488包/秒的中间速率(0.26%的错误),这与Windows相当,但会以同样的方式消耗CPU,所以效率很低。在

问题

这就是我要说的。我们如何在Linux中使用sleep()来保持CPU的合理使用,同时仍然有相当好的计时精度?

我认为这将涉及某种监督和补偿程序,但我不太确定如何实施这样的事情。有没有一种标准的方法来处理这种纠错问题?在

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值