我正在寻找真实的可调参数来帮助优化设置的性能,这些设置将硬件RAID控制器与SAS磁盘(Smart Array,Perc,LSI等)和电池支持或闪存支持的缓存相结合.假设RAID 1 0和多个主轴(4个磁盘).
我花了相当多的时间调整Linux网络设置,以实现低延迟和金融交易应用程序.但其中许多选项都有详细记录(更改发送/接收缓冲区,修改TCP窗口设置等).工程师在存储方面做了什么?
从历史上看,我已经对I/O scheduling elevator进行了更改,最近选择了截止日期和noop调度程序来提高我的应用程序的性能.随着RHEL版本的发展,我也注意到SCSI和CCISS块设备的编译默认值也发生了变化.这会随着时间的推移对建议的存储子系统设置产生影响.但是,自从我看到任何明确的建议以来,已经有一段时间了.我知道操作系统默认值不是最佳的.例如,对于服务器级硬件上的部署,似乎128kb的默认预读缓冲区非常小.
以下文章探讨了在块队列上更改预读缓存和nr_requests值对性能的影响.
http://zackreed.me/articles/54-hp-smart-array-p410-controller-tuning
http://www.overclock.net/t/515068/tuning-a-hp-smart-array-p400-with-linux-why-tuning-really-matters
http://yoshinorimatsunobu.blogspot.com/2009/04/linux-io-scheduler-queue-size-and.html
例如,这些是HP Smart Array RAID控制器的建议更改:
echo "noop" > /sys/block/cciss\!c0d0/queue/scheduler blockdev --setra 65536 /dev/cciss/c0d0 echo 512 > /sys/block/cciss\!c0d0/queue/nr_requests echo 2048 > /sys/block/cciss\!c0d0/queue/read_ahead_kb
还有哪些可以可靠地调整以提高存储性能?
我特意在生产场景中寻找sysctl和sysfs选项.
解决方法
同样对于read_ahead_kb,我发现对于顺序读/写,增加此值可提供更好的吞吐量,但我发现此选项实际上取决于您的工作负载和IO模式.例如,在我最近调整的数据库系统上,我更改了此值以匹配单个数据库页面大小,这有助于减少读取延迟.超出此值的增加或减少证明在我的情况下会损害性能.
至于块设备队列的其他选项或设置:
max_sectors_kb =我设置此值以匹配硬件允许单次传输的值(检查sysfs中max_hw_sectors_kb(RO)文件的值以查看允许的内容)
nomerges =这使您可以禁用或调整查找逻辑以合并io请求. (将其关闭可以节省一些cpu周期,但是在为我的系统更改此设置时我没有看到任何好处,所以我将其保留为默认值)
rq_affinity =我还没有尝试过,但这里是内核文档背后的解释
If this option is ‘1’,the block layer will migrate request completions to the
cpu “group” that originally submitted the request. For some workloads this
provides a significant reduction in cpu cycles due to caching effects.
For storage configurations that need to maximize distribution of completion
processing setting this option to ‘2’ forces the completion to run on the
requesting cpu (bypassing the “group” aggregation logic)”
scheduler =你说你试过截止日期和noop.我已经测试了noop和截止日期,但是我发现我最近为数据库服务器做的测试已经找到了截止日期.
NOOP表现不错,但对于我们的数据库服务器,我仍然能够在调整截止日期调度程序时获得更好的性能.
截止日期调度程序的选项位于/ sys / block / {sd,cciss,dm – } * / queue / iosched /:
fifo_batch =类似于nr_requests,但特定于调度程序.经验法则是将其调低以降低延迟或提高吞吐量.控制读取和写入请求的批处理大小.
write_expire =设置写批次的到期时间默认为5000ms.再次减小此值会减少写入延迟,同时增加该值会增加吞吐量.
read_expire =设置读取批次的到期时间默认为500ms.这里适用相同的规则.
front_merges =我倾向于关闭它,默认情况下它是打开的.我没有看到调度程序需要浪费cpu周期来尝试合并IO请求.
writes_starved =因为截止日期是针对读取的,所以默认处理是在处理写入批处理之前处理2个读取批处理.我发现默认值为2对我的工作量有好处.