c++ - IO 饥饿的原因?
问题描述
我有一种复杂的应用程序,它使用大量的 IO:它包括ffmpeg
并进行视频转码(通过软件,没有可用的硬件加速)。这可能不重要,但我想强调它。
所有视频转码功能均独立运行std::thread
,libev
用于 IO 管理。
硬件细节:
- CPU架构是ARM
- 操作系统是 Debian。
现在,我正在尝试使用它ping
来检查特定服务器是否可用。我找到了 ping 的开源,并包含在应用程序中。这是一个完全不同的运行std::thread
。
问题:
如果没有正在进行的视频转码,ping 功能将按预期工作。但是,当进行 CPU 密集型转码时,ping 函数 99% 会超时返回。我怀疑存在某种 IO 饥饿,所以我深入研究了 ping 源:
我发现 ping 使用旧select
函数调用来检测是否有可用的 I/O。我几乎可以肯定这会导致问题,并且我已经重构了代码: drop select
,并付诸libev
行动。
但不幸的是,饥饿仍然保持不变。
我几乎接受了这一点,因为视频转码确实给 CPU 带来了巨大的负载(70-80%)。
但是,如果我从 SSH 会话 #A 运行我的应用程序,并从另一个 SSH 会话 #B 运行 ping,我的应用程序可以进行转码,并且会话 #B 上的 ping 不会丢失单个数据包。
结论:
硬件似乎能够与 ping 并行运行我的繁重应用程序。
问题:
我真的很好奇:
- Linux 上每个进程可以使用多少个 IO 有限制吗?(我猜,但我怎么知道这个限制?我怎样才能提高这个限制?我怎样才能检查当前的使用情况?)
- 如果 IO 限制没有任何问题,还有什么会导致这种“饿死”的问题
std::threads
呢?(无论如何,pings 线程似乎没有阻塞,因为它收到超时。它只是没有收到免费的 IO 操作)更准确:ping 实际上可以发送数据包,但它们似乎没有返回。而且我几乎可以肯定那些 ping 数据包回复会回来,只是我的应用程序没有获得 READ 操作的绿灯。
解决方案
推荐阅读
- python-3.x - 如何将 importlib.resources 与 pickle 文件一起使用?
- amazon-web-services - 假设我是 AWS IAM 用户,有什么方法可以让我使用 CLI 或控制台检查已授予我哪些资源权限
- python-3.x - 为什么 hyperopt 在随机森林中运行时会给出最好的损失 Nan?
- ruby-on-rails - AWS:Ruby describe_instance_type_offerings() 给出异常:“未定义的方法”
- vue.js - Vue Router Meta 对象未定义
- c++ - 扩展/专业化`模板
zero()` 到可调用的 `T` - flutter - 使用 PageView、Swiper 或 Liquid_swiper 时是否可以禁用页面?
- python - R 和 Python 中的列向量
- django - Django - 查询集中两个特定字段的划分
- java - 如何使用 Java API 根据多个字段对弹性搜索记录进行排序?