eww*_*ite 29 storage hp performance-tuning hp-smart-array hardware-raid
我管理的大多数 Linux 系统都具有硬件 RAID 控制器(主要是HP Smart Array)。他们都在运行 RHEL 或 CentOS。
我正在寻找真实世界的可调参数,以帮助优化将硬件 RAID 控制器与 SAS 磁盘(智能阵列、Perc、LSI 等)和电池后备或闪存后备缓存相结合的设置的性能。假设 RAID 1+0 和多个主轴(4 个以上的磁盘)。
我花了大量时间为低延迟和金融交易应用程序调整 Linux 网络设置。但其中许多选项都有详细记录(更改发送/接收缓冲区、修改 TCP 窗口设置等)。工程师在存储方面做什么?
从历史上看,我对I/O 调度电梯进行了更改,最近选择了deadline和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
Run Code Online (Sandbox Code Playgroud)
还有什么可以可靠地调整来提高存储性能?
我专门在生产场景中寻找 sysctl 和 sysfs 选项。
小智 38
我发现当我不得不调整较低的延迟与吞吐量时,我已经将 nr_requests 从它的默认值调低(低至 32)。更小批量的想法等于更低的延迟。
同样对于 read_ahead_kb,我发现对于顺序读/写,增加此值可提供更好的吞吐量,但我发现此选项实际上取决于您的工作负载和 IO 模式。例如,在我最近调整的数据库系统上,我更改了该值以匹配单个数据库页面大小,这有助于减少读取延迟。在我的情况下,增加或减少超过这个值会损害性能。
至于块设备队列的其他选项或设置:
max_sectors_kb = 我已将此值设置为与硬件允许的单次传输相匹配(检查 sysfs 中 max_hw_sectors_kb (RO) 文件的值以查看允许的值)
nomerges = 这使您可以禁用或调整合并 io 请求的查找逻辑。(关闭此功能可以为您节省一些 CPU 周期,但在为我的系统更改此设置时我没有看到任何好处,因此我将其保留为默认值)
rq_affinity = 我还没有尝试过,但这里是内核文档中的解释
如果此选项为“1”,则块层会将请求完成迁移到最初提交请求的 cpu“组”。对于某些工作负载,由于缓存效应,这会显着减少 CPU 周期。
对于需要最大化完成处理分布的存储配置,将此选项设置为 '2' 强制完成在请求 CPU 上运行(绕过“组”聚合逻辑)”
scheduler = 你说你试过deadline 和noop。我已经测试了 noop 和deadline,但发现我最近为数据库服务器所做的测试中,deadline 胜出。
NOOP 表现良好,但对于我们的数据库服务器,我仍然能够通过调整截止日期调度程序获得更好的性能。
位于 /sys/block/{sd,cciss,dm-}*/queue/iosched/ 下的截止日期调度程序选项:
fifo_batch = 有点像 nr_requests,但特定于调度程序。经验法则是降低延迟或提高吞吐量。控制读取和写入请求的批量大小。
write_expire = 设置写入批次的过期时间默认为 5000 毫秒。再次减小此值会减少写入延迟,而增加该值会增加吞吐量。
read_expire = 设置读取批次的过期时间默认为 500 毫秒。此处适用相同的规则。
front_merges = 我倾向于关闭它,默认情况下它是打开的。我不认为调度程序需要浪费 CPU 周期来尝试前置合并 IO 请求。
writes_starved = 因为截止时间是针对读取的,所以这里的默认值是在处理写入批次之前处理 2 个读取批次。我发现默认值 2 适合我的工作量。
| 归档时间: |
|
| 查看次数: |
18019 次 |
| 最近记录: |