Ale*_*Flo 3 linux debian find ssd performance-tuning
我在 SSD 驱动器配置为 RAID 1 的 Debian 服务器上运行此命令:
ionice -c 3 find . -type f -amin -1440 -mmin +1441 -not -path custom/ -print0
在包含超过 170 万个文件和目录的路径上。
我注意到每次运行此命令时,服务器负载都会达到峰值,我想知道是否有任何方法可以限制find速度,使其不会产生如此高的负载。
另外我想知道这里是否有特定于 SSD 的选项以减少负载生成find
这归结为文件系统和 procfs 调整。您所解释的“高”负载是指系统上的其他正常进程缺乏读取而被迫等待的情况。
情况的特点是
使用 noop 调度程序在这里没有帮助,因为 noop 是简单的 FIFO 调度程序,并且不能帮助您为磁盘访问游戏带来更多公平性。所以我建议使用截止日期调度程序。
截止时间调度程序的想法是为某些磁盘 IO 操作预测最终截止时间,同时维护两个简单的队列 - 一个用于读取,一个用于写入;您可以调整读取与写入之间的亲和力,以及在当前操作停止和满足接近过期的 IO 任务之前可以容忍某些读/写在队列中停留的时间。
此外,您想要的是在 RAM 中缓存大量目录条目和文件 inode 数据。这种缓存在遍历如此大的目录/文件结构时将大大节省磁盘IO。
grep ^Slab /proc/meminfo
Run Code Online (Sandbox Code Playgroud)
这将告诉您有多少内存完全专用于目录条目和文件缓存。有关 Slab 内存的分割/使用内容和方式的详细信息,请参阅
/proc/slabinfo
Run Code Online (Sandbox Code Playgroud)
您可以运行slabtop以获取交互式使用统计信息。
最终,如果您决定增加更多此类缓存,您希望减少
sysctl -w vm.vfs_cache_Pressure=20
默认设置为 100,这是在系统内存不足的情况下尝试相当减少用于缓存 d_entry 文件 inode 与页面缓存(即 RAM 中的文件/程序数据缓存)的内存量通过减少您的值更愿意保留那些 d_entry/file inode 缓存,因此如果由于内存压力而从缓存中删除了相同的数据,则需要更少的读取操作来从磁盘重新读取相同的数据。
此外,为了提高磁盘读取能力,我建议增加预读。
blockdev --getra /dev/sda
blockdev --setra 2048 /dev/sda
这应该可以帮助您压缩一些额外的 IOPS,特别是当您的系统执行的读取多于写入时。(检查 iostat 是否可以提供帮助;第一行始终是自启动时间以来的聚合使用,因此很容易从中设计比率)
接下来我会考虑调整的是缩小规模是 nr_requests
回声 32 > /sys/block/sda/queue/nr_requests
通过这样做,您基本上会拥有更短的批次,这将允许更多的延迟,但代价是我们在那里获得了一些吞吐量。具有多个进程的系统将从中受益,因为单个进程将很难主导 IO 队列,而其他进程却挨饿。
有关此内容的更多信息也可以在此处找到:硬件 RAID 控制器调整
另一种可能具有高负载的情况是,如果您的正常系统活动被某些间歇性大批量写入(例如大文件下载、复制、解包操作)中断。写入也很容易使磁盘 IO 饱和,为了解决这些问题,我建议稍微调低以下值。
vm.dirty_background_ratio
vm.dirty_ratio
小心别降得太低。要了解这个想法,您可以使用atop工具并检查磁盘统计信息,您可以在其中查看内存中通常有多少脏数据;有多少进程受益于脏内存(磁盘统计中的 WCANCL 列)并略高于这些使用率。
这些将有助于引入用于写回限制的内核机制,该机制试图通过进行大量写入来减慢影响系统 IO 的进程。有关更多信息,请检查写回限制