概述
问题
我正在测试一个使用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的合理使用,同时仍然有相当好的计时精度?
我认为这将涉及某种监督和补偿程序,但我不太确定如何实施这样的事情。有没有一种标准的方法来处理这种纠错问题?在
最后
以上就是过时枕头为你收集整理的linux如何使cpu保持最佳,我们如何在Linux中使用sleep()来保持CPU的合理使用率,同时又有不错的计时精度呢?...的全部内容,希望文章能够帮你解决linux如何使cpu保持最佳,我们如何在Linux中使用sleep()来保持CPU的合理使用率,同时又有不错的计时精度呢?...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复