Vertica Linux Dirty Data 参数调优¶
刷新脏数据 (Flushing Dirty Data)¶
将缓存中的脏数据刷新到磁盘时,Linux 默认允许 120 秒完成刷新。在此期间,Vertica 进程可能会表现为挂起状态。
如果磁盘负载过高,120 秒不够用,你会看到 dmesg 或 var/log/messages 输出中出现以下错误:
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message
vertica D 0000000000000002 0 60068 1 0x00000080
ffff88024d9e7c98 0000000000000082 ffffffff81ed09f0 ffff882012336ae0
ffff88024d9e7c68 ffffffff810aa570 ffff88024d9e7ca0 ffff882012336ae0
ffff882012337098 ffff88024d9e7fd8 000000000000fb88 ffff882012337098 Call Trace:
2401 [<ffffffff810aa570>] ? exit_robust_list+0x90/0x160
2402 [<ffffffff81072f95>] exit_mm+0x95/0x180
2403 [<ffffffff810733df>] do_exit+0x15f/0x870
2404 [<ffffffff81063340>] ? wake_up_state+0x10/0x20
2405 [<ffffffff81073b48>] do_group_exit+0x58/0xd0
2406 [<ffffffff81088e16>] get_signal_to_deliver+0x1f6/0x460
2407 [<ffffffff8100a265>] do_signal+0x75/0x800
2408 [<ffffffff81435b25>] ? sys_sendto+0x185/0x190
2409 [<ffffffff8100bbee>] ? invalidate_interrupt1+0xe/0x20
2410 [<ffffffff8100bc2e>] ? invalidate_interrupt3+0xe/0x20
2411 [<ffffffff8100bbce>] ? invalidate_interrupt0+0xe/0x20
2412 [<ffffffff810ace0b>] ? sys_futex+0x7b/0x170
2413 [<ffffffff8100aa80>] do_notify_resume+0x90/0xc0
2414 [<ffffffff8100b341>] int_signal+0x12/0x17
根本原因 (Root Cause)¶
此问题的根本原因是处理能力失衡。在 Vertica 中,内存和处理能力(CPU)可能过高,而磁盘吞吐量相对过低,无法跟上。所有 Vertica 节点必须保持 CPU、RAM、磁盘吞吐量和网络带宽的适当平衡。
此错误通常发生在以下系统:
- 相对于磁盘吞吐量,内存和 CPU 处理能力较大的系统
- 磁盘吞吐量较低的系统(例如,虚拟机或使用存储区域网络 (SAN) 且磁盘吞吐量受限的机器)
解决方案 (Solution)¶
为防止此问题,请考虑以下调优方案。这些调优适用于所有 Vertica 版本:
- 减少
vm.dirty_ratio,以降低分配给脏页的最大内存量。
如果写入吞吐量为 400 MB/秒,则 15 秒内可以写入 6 GB 数据。要计算 vm.dirty_ratio,将 15 秒内可传输的数据量除以 RAM 总量。例如:
- 对于 256 GB 系统:6/256 = 2.5%,设置
vm.dirty_ratio= 3(近似值) - 对于 128 GB 系统:6/128 = 4.6%,设置
vm.dirty_ratio= 5(近似值)
如果将磁盘吞吐量翻倍(例如从 400MB/秒提高到 800MB/秒),也应该将 vm.dirty_ratio 翻倍。
- 降低
vm.dirty_background_ratio值,以更频繁地将缓存刷新到磁盘。具体来说,将vm.dirty_background_ratio设置为vm.dirty_ratio的一半。这样,当缓存半满时,就会开始向磁盘刷新。例如,如果vm.dirty_ratio= 6,则将vm.dirty_background_ratio设置为 3。
vm.dirty_background_ratio 参数指定脏数据占系统内存的百分比。达到此百分比时,Linux 开始刷新缓冲区。vm.dirty_background_ratio 取决于可用的磁盘吞吐量,并且与系统总内存成反比。
- 为防止在 Vertica 刷新期间暂停时发生内核恐慌(kernel panic),将
hung_task_panic设置为 0。这允许进程无限期地刷新数据,而不是关闭节点。
更多信息 (For More Information)¶
扩展阅读¶
-
Vertica Linux IO 调度器性能影响与调优 — IO 调度器选择与内核参数调优
-
Vertica 监控最佳实践 — Vertica 集群监控与调优