Linux 在 I/O 负载期间冻结

Linux 在 I/O 负载期间冻结

我使用 Linux Mint 和 Dell XPS 15 作为工作笔记本电脑,并使用 gradle 构建一个大型 Android 应用程序。

经过所有优化,它仍然使用几乎所有可用 RAM (16 GB) 并开始使用交换文件中的 SWAP(也许我应该使用交换分区?)。它会导致高 I/O 速率并且 Cinnamon(以及所有其他应用程序)冻结。

另外,我尝试测试 I/O 是这些问题的原因,并发现运行dd为我的 I/O 系统创建负载的命令也会导致相同的问题。 (例如,我无法在 Mac OS 上重现此行为)

我发现我应该将 I/O 调度程序类型更改为deadline,但我的/sys/block/nvme0n1/queue/scheduler文件仅包含none选项。据我了解,这意味着https://www.thomas-krenn.com/en/wiki/Linux_Multi-Queue_Block_IO_Queueing_Mechanism_(blk-mq)使用框架,我不应该改变任何东西。

问题:如何解决 I/O 负载期间的这些冻结问题?也许,我应该分析哪些指标才能获取更多信息?

环境:

OS: Linux Mint 18.3 Cinnamon 64-bit
Cinnamon: 3.6.7
Linux Kernel: 4.13.0-38-generic

答案1

经过所有优化,它仍然使用几乎所有可用 RAM (16 GB)

- WHO?通常,自 20 世纪 70 年代以来设计的每个通用操作系统都会使用所有可用 RAM 或其大部分来密集地缓存慢速存储内容。如果方法虚拟机缓存有什么烦恼呢?运行free -m并研究它的输出,它曾经有“+/-缓存/缓冲区”的特殊指示,暗示它不是不可撤销的使用 -如果存在内存压力,缓存会缩小

这是新手很典型的误解……


我发现我应该将 I/O 调度程序类型更改为截止日期

调度程序适用于 HDD 等慢速设备。对于 SSD/NVME,这只是额外的开销 - 您不需要为请求排队,因为重新排序它们没有任何好处 - 与 HDD 相反,HDD 在减少寻道时间方面发挥着重要作用。


如何解决 I/O 负载期间的这些冻结问题?

这里没有读心术的人(作为一个例外,我宁愿隐藏自己的才能,以免其他人嫉妒),dd可以以不同的方式运行,为什么不添加一个片段来显示它到底是如何运行的?

PS 一般来说,我可以建议更新内核,因为它可能是特定的驱动程序怪癖得到(或没有)解决。

相关内容