我注意到,当我执行大量写入应用程序时,整个系统都会变慢。为了进一步测试这一点,我运行它来执行(相对)低 CPU、高磁盘活动:
john -incremental > file_on_SSD
这每秒会向我的系统磁盘上的文件中输出数万个字符串。
当这样做时,鼠标会滞后,TTY 变得无响应,应用程序“消失”,并且通常整个计算机变得无法使用。当我最终可以 Control+C 时john
,系统会在几秒钟后恢复到全力状态。
这是一个极端的例子,但我也遇到了类似的问题,即写入密集程度稍低的活动,例如从快速源复制大文件或转码。
我的主操作系统磁盘是一个相当快的 SSD(OCZ 敏捷 60GB)与 EXT4。如果我john
使用 EXT4 将 的输出写入机械磁盘,尽管速度慢很多(SSD 每秒约 42,000 个字,机械每秒 8,000 个字),但我不会遇到同样的减速情况。吞吐量可能是相关的。机械盘也与系统无关。这只是数据。
我使用的是内核 2.6.35-2,但自从我获得此 SSD 以来,我就注意到了这个问题,当时我可能正在使用 .31 或当时的其他版本。
那么是什么导致了速度放缓呢? EXT4问题?内核问题? SSD问题?上述所有的?还有别的事吗?
如果您认为我需要运行额外的测试,只需发表评论告诉我该怎么做,我会将结果附加到问题中。
答案1
这已经是一个已知问题一段时间了。使用像 Btrfs 这样经过 SSD 调整的 FS 可能会有所帮助,但也可能不会。
归根结底,这是 IO 调度程序/内存管理系统中的一个错误。最近,出现了一些旨在解决此问题的补丁。看已修复:Linux 桌面响应问题?
这些补丁最终可能会进入主线内核,但目前,如果您想解决此问题,您可能必须编译自己的内核。
答案2
您可以检查一些事项来尝试提高 Linux 下的 SSD 性能。
将安装点设置为“noatime”。在大多数用例中,额外的活动更新访问时间通常被浪费。特别是在不断将单行注入文件的情况下,每次访问都会强制对文件系统进行多次更新。
检查电梯。大多数发行版的默认电梯都是为随机访问旋转盘而设置的。 SSD 不需要额外的逻辑,因此将电梯设置为 noop 可以通过让硬件管理写入来提高性能。
直写式 v 回写式缓存。这有点深奥,但您可以检查
hdparm
设备使用的缓存方法。与直写式相比,回写式缓存可以对 SSD 性能产生积极影响。
答案3
您的文件缓存可能没有根据您的工作负载进行错误调整。不幸的是,Linux 内核很愚蠢,无法自动处理这个问题,如果你有大量 RAM 和足够慢的块设备,默认值会非常糟糕。看https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/了解详情。
我建议尝试/etc/sysctl.conf
修改
vm.dirty_background_ratio = 3
vm.dirty_ratio = 6
大大减少写缓存造成的 RAM 压力,让内核更好地处理其他任务。这将以改善延迟换取较低吞吐量。
另一种可能性是增加缓存,但如果您的进程一直不断地写入新数据,那么如果缓存已满,您将遇到非常严重的延迟。如果你想尝试一下,你可以做类似的事情
vm.dirty_background_ratio = 5
vm.dirty_ratio = 80
请注意,*_ratio
设置是指可用 RAM 的百分比。如果您想要更好的控制,请使用*_bytes
设置。我个人对我的工作站使用以下配置:
vm.dirty_background_bytes = 50000000
vm.dirty_bytes = 200000000
这会将后台写入缓存限制为 50 MB,如果缓存中有 200 MB,则强制同步写入。