跳转至

Vertica Linux Dirty Data 参数调优

原文:Tuning Linux Dirty Data Parameters for Vertica

刷新脏数据 (Flushing Dirty Data)

将缓存中的脏数据刷新到磁盘时,Linux 默认允许 120 秒完成刷新。在此期间,Vertica 进程可能会表现为挂起状态。

如果磁盘负载过高,120 秒不够用,你会看到 dmesgvar/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 版本:

  1. 减少 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 翻倍。

  1. 降低 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 取决于可用的磁盘吞吐量,并且与系统总内存成反比。

  1. 为防止在 Vertica 刷新期间暂停时发生内核恐慌(kernel panic),将 hung_task_panic 设置为 0。这允许进程无限期地刷新数据,而不是关闭节点。

更多信息 (For More Information)

请参见 Linux Kernel panic issue: How to fix hung_task_timeout_secs and blocked for more than 120 seconds problem

扩展阅读