【问题标题】:long latency detected in simple Linux helloworld program在简单的 Linux helloworld 程序中检测到长延迟
【发布时间】:2020-09-24 16:39:50
【问题描述】:

我有一个非常简单的 hello world 程序,它打印 hello world,然后使用一对 gettimeofday() 将 usleep(50) 调用括起来。如果两次 gettimeofday() 调用之间经过的时间大于 5 毫秒,我会 printf。

在 Linux Vmware VM 上运行时,甚至在本机 Linux 笔记本电脑上运行时,我注意到有时我会得到从 5 毫秒到 10 毫秒的经过时间。与 VMware 相比,我在本机 Linux 笔记本电脑上看到的 printf 少得多,但它仍然出现。在本机 Linux 笔记本电脑上,经过的时间甚至高达 20 毫秒,但我看到的 printf 比在 VMWare 上要少得多。

为什么会这样? VMware 或本机 Linux 笔记本电脑都不是很忙。

如何缓解这种情况?

感谢任何见解。

【问题讨论】:

  • 你使用的是 x86 吗?

标签: linux linux-kernel


【解决方案1】:

如果您的目标是编写具有确定执行时间的软件,我会建议以下内容(按照估计影响的粗略顺序):

  1. 确保您有一个运行 Linux on-the-metal 的测试环境。 IE。没有 VM 设置,因为 Linux 将始终受主机操作系统调度程序的支配。

  2. 请注意,任何打印都意味着执行某种 I/O。根据驱动程序的不同,I/O 可能会在完成之前阻塞内核线程或其他进程(例如,由于锁争用),因此调用 puts("Hello, World!") 之类的时间会有很大差异。

  3. 阅读 Linux 提供的不同调度策略; sched_setscheduler 的联机帮助页是一个很好的起点。注意:nice 不是您正在寻找的机器人。

  4. 如果您的系统使用交换,通过将应用程序的内存锁定在 RAM 中来消除由页面错误引起的延迟;请参阅mlock 和朋友的手册页。

  5. 将您的内核换成配置了CONFIG_PREEMPT_RT 和相关设置(如线程 IRQ、优先级反转安全互斥锁等)的内核。

  6. 阅读Real-Time Linux Wiki上的所有内容,然后再阅读一遍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2012-10-07
    • 2013-10-14
    相关资源
    最近更新 更多