Files
Utils/Proxmox/RAID0-x3-tuning.md
T
2025-11-05 22:52:43 +03:00

272 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Вариант 1 — Пересоздание XFS на том же логическом томе (`vg0/data`)
Этот вариант подходит, если ты готов удалить все виртуальные машины и контейнеры (VM/LXC)
и настроить их заново. Он полностью очищает файловую систему `/var/lib/vz`
и создаёт новую XFS с оптимальными параметрами под RAID0 (6×NVMe, chunk 128 KB).
---
## 🔹 Шаги
### 1. Останови все контейнеры и ВМ
```bash
qm list
pct list
systemctl stop pvedaemon pve-cluster pve-storage pveproxy
```
---
### 2. Размонтируй `/var/lib/vz`
```bash
umount /var/lib/vz
```
Если появится ошибка `busy`, проверь, какие процессы удерживают каталог:
```bash
lsof +D /var/lib/vz
```
и заверши эти процессы.
---
### 3. Пересоздай файловую систему XFS
Оптимальные параметры для RAID0 с chunk = 1 Mb и 6 дисков для блокчейнов:
```bash
mkfs.xfs -f -s size=4096 -l size=1g -n size=4096 -d su=1m,sw=3 /dev/md3
```
Проверка, что XFS «увидел» выравнивание:
```bash
xfs_info /dev/md3 | egrep 'sunit|swidth|sectsz'
# Ожидаем: sunit=256 (256 * 4K = 1MiB), swidth=768 (768 * 4K = 3MiB), sectsz=4096
```
```bash
mkdir -p /var/lib/vz
UUID=$(blkid -s UUID -o value /dev/md3)
echo "UUID=$UUID /var/lib/vz xfs defaults,noatime,inode64,logbufs=8,logbsize=256k 0 2" >> /etc/fstab
mount -a
```
### 6. Перезапусти службы Proxmox
```bash
systemctl start pve-cluster pvedaemon pve-storage pveproxy
```
---
## ✅ Результат
После выполнения этих шагов:
- `/var/lib/vz` будет чистой, новой XFS-файловой системой,
оптимизированной под RAID0 (3×NVMe, chunk 1 МБ).
- Proxmox автоматически подхватит хранилище после старта сервисов.
- Система готова к развертыванию новых VM и LXC-контейнеров.
---
### 📋 Проверка
После монтирования убедись в правильности параметров:
```bash
xfs_info /var/lib/vz | grep -E "sunit|swidth"
df -h /var/lib/vz
```
Ожидаемые значения:
```
= sunit=256 swidth=1536 blks
= sectsz=4096 sunit=1 blks, lazy-count=1
Filesystem Size Used Avail Use% Mounted on
/dev/md3 11T 205G 11T 2% /var/lib/vz
```
-----
Да — ✅ эти настройки стоит применить, особенно если у тебя RAID 0 из нескольких NVMe и ты используешь ноду (например, Reth / Nethermind / Erigon) с большими sequential-чтениями и trace/debug.
Разберём по пунктам, зачем каждая настройка:
🧠 1. read_ahead_kb
Позволяет ядру читать данные «с запасом» при последовательном чтении.
Устройство Значение Эффект
/sys/block/md1/queue/read_ahead_kb 4096 RAID-массив (XFS): читать по 4 МБ заранее
/sys/block/nvme*/queue/read_ahead_kb
👉 На Ethereum-архивах (особенно при trace и debug) это даёт +10-20 % скорости при холодных чтениях и снижает IOPS-нагрузку.
⚙️ 2. irqbalance
Этот демон равномерно распределяет аппаратные прерывания NVMe-дисков между CPU-ядрами.
Без него все IRQ могут обрабатываться одним ядром, и даже самый быстрый RAID будет «тормозить» при многопоточном доступе.
Установка и включение:
```bash
apt update
apt install irqbalance -y
systemctl enable --now irqbalance
systemctl status irqbalance
```
```bash
echo 4096 | sudo tee /sys/block/md3/queue/read_ahead_kb
for d in /sys/block/nvme*n1/queue/read_ahead_kb; do echo 2048 | sudo tee "$d"; done
```
💾 3. Применение постоянных значений
Чтобы после перезагрузки не сбрасывались, добавь в /etc/rc.local или systemd-юнит, например:
```bash
cat >/usr/local/sbin/raid-tuning.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
# RAID массив(ы): 4 MiB readahead
[ -e /sys/block/md3/queue/read_ahead_kb ] && echo 4096 > /sys/block/md3/queue/read_ahead_kb
# NVMe диски: 2 MiB readahead + scheduler=none
for d in /sys/block/nvme*n1; do
[ -e "$d/queue/read_ahead_kb" ] && echo 2048 > "$d/queue/read_ahead_kb"
[ -e "$d/queue/scheduler" ] && echo none > "$d/queue/scheduler"
done
EOF
chmod +x /usr/local/sbin/raid-tuning.sh
```
```bash
cat >/etc/systemd/system/raid-tuning.service <<'EOF'
[Unit]
Description=RAID/NVMe tuning
After=mdadm-raid.service local-fs.target
Wants=mdadm-raid.service
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/raid-tuning.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
```
```bash
systemctl daemon-reload
systemctl enable --now raid-tuning.service
systemctl enable --now fstrim.timer
systemctl status raid-tuning.service --no-pager
```
```bash
for f in /sys/block/md*/queue/read_ahead_kb; do printf "%s: %s\n" "$f" "$(cat "$f")"; done
for f in /sys/block/nvme*n1/queue/read_ahead_kb; do printf "%s: %s\n" "$f" "$(cat "$f")"; done
```
🧠 Что делает irqbalance
irqbalance автоматически распределяет аппаратные прерывания (IRQ) от NVMe, сетевых и других устройств по разным CPU-ядрам.
Для серверов с:
несколькими NVMe,
RAID0,
большим количеством потоков (64 ядра, как у тебя на EPYC 7502P),
это снижает latency и делает нагрузку по NVMe-дискам ровнее.
🔍 Проверка распределения IRQ
После запуска можно убедиться, что прерывания действительно разнесены по ядрам:
```bash
grep -i nvme /proc/interrupts
```
```bash
161: 1000000 0 0 0 IR-PCI-MSI nvme0q1
162: 0 900000 0 0 IR-PCI-MSI nvme1q1
163: 0 0 800000 0 IR-PCI-MSI nvme2q1
```
Быстрый sanity-тест диска:
```bash
fio --name=seqread --filename=/var/lib/vz/fio.test --size=20G --rw=read --bs=1M --iodepth=32 --direct=1 --runtime=30 --time_based --group_reporting
fio --name=seqwrite --filename=/var/lib/vz/fio.test --size=20G --rw=write --bs=1M --iodepth=32 --direct=1 --runtime=30 --time_based --group_reporting
rm -f /var/lib/vz/fio.test
```
RAID0x6
```bash
seqread: (g=0): rw=read, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=psync, iodepth=32
fio-3.39
Starting 1 process
seqread: Laying out IO file (1 file / 20480MiB)
note: both iodepth >= 1 and synchronous I/O engine are selected, queue depth will be capped at 1
Jobs: 1 (f=1): [R(1)][100.0%][r=2943MiB/s][r=2942 IOPS][eta 00m:00s]
seqread: (groupid=0, jobs=1): err= 0: pid=211291: Thu Oct 23 08:39:48 2025
read: IOPS=2923, BW=2924MiB/s (3066MB/s)(85.7GiB/30001msec)
clat (usec): min=182, max=2295, avg=341.71, stdev=229.11
lat (usec): min=183, max=2295, avg=341.74, stdev=229.11
clat percentiles (usec):
| 1.00th=[ 186], 5.00th=[ 186], 10.00th=[ 186], 20.00th=[ 188],
| 30.00th=[ 192], 40.00th=[ 192], 50.00th=[ 192], 60.00th=[ 194],
| 70.00th=[ 619], 80.00th=[ 619], 90.00th=[ 619], 95.00th=[ 619],
| 99.00th=[ 635], 99.50th=[ 1057], 99.90th=[ 2180], 99.95th=[ 2278],
| 99.99th=[ 2278]
bw ( MiB/s): min= 2864, max= 2984, per=100.00%, avg=2925.56, stdev=28.52, samples=59
iops : min= 2864, max= 2984, avg=2925.56, stdev=28.52, samples=59
lat (usec) : 250=66.13%, 500=0.04%, 750=33.32%, 1000=0.01%
lat (msec) : 2=0.31%, 4=0.19%
cpu : usr=0.18%, sys=20.96%, ctx=87762, majf=0, minf=264
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=87717,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=32
Run status group 0 (all jobs):
READ: bw=2924MiB/s (3066MB/s), 2924MiB/s-2924MiB/s (3066MB/s-3066MB/s), io=85.7GiB (92.0GB), run=30001-30001msec
Disk stats (read/write):
dm-2: ios=87372/3, sectors=178921472/40, merge=0/0, ticks=27671/0, in_queue=27671, util=92.36%, aggrios=701744/661, aggsectors=179644416/101672, aggrmerge=0/0, aggrticks=76026/107, aggrin_queue=76133, aggrutil=92.29%
md1: ios=701744/661, sectors=179644416/101672, merge=0/0, ticks=76026/107, in_queue=76133, util=92.29%, aggrios=116956/89, aggsectors=29940736/16945, aggrmerge=1/20, aggrticks=20080/38, aggrin_queue=20118, aggrutil=58.99%
nvme1n1: ios=116964/81, sectors=29942784/16624, merge=4/10, ticks=13644/33, in_queue=13676, util=17.87%
nvme5n1: ios=116944/125, sectors=29937664/17208, merge=0/39, ticks=51833/67, in_queue=51900, util=58.99%
nvme2n1: ios=116944/87, sectors=29937664/16960, merge=0/48, ticks=16230/34, in_queue=16263, util=7.48%
nvme3n1: ios=116960/75, sectors=29941760/17488, merge=4/1, ticks=14628/31, in_queue=14660, util=12.67%
nvme0n1: ios=116964/84, sectors=29942784/16792, merge=0/22, ticks=10502/34, in_queue=10535, util=7.43%
nvme4n1: ios=116960/85, sectors=29941760/16600, merge=0/4, ticks=13645/34, in_queue=13678, util=14.23%
seqwrite: (g=0): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=psync, iodepth=32
fio-3.39
Starting 1 process
note: both iodepth >= 1 and synchronous I/O engine are selected, queue depth will be capped at 1
Jobs: 1 (f=1): [W(1)][100.0%][w=2927MiB/s][w=2927 IOPS][eta 00m:00s]
seqwrite: (groupid=0, jobs=1): err= 0: pid=211615: Thu Oct 23 08:40:18 2025
write: IOPS=2940, BW=2940MiB/s (3083MB/s)(86.1GiB/30001msec); 0 zone resets
clat (usec): min=166, max=2283, avg=336.58, stdev=234.58
lat (usec): min=169, max=2286, avg=339.79, stdev=234.58
clat percentiles (usec):
| 1.00th=[ 169], 5.00th=[ 169], 10.00th=[ 172], 20.00th=[ 174],
| 30.00th=[ 178], 40.00th=[ 188], 50.00th=[ 188], 60.00th=[ 190],
| 70.00th=[ 619], 80.00th=[ 619], 90.00th=[ 627], 95.00th=[ 627],
| 99.00th=[ 644], 99.50th=[ 660], 99.90th=[ 2114], 99.95th=[ 2245],
| 99.99th=[ 2278]
bw ( MiB/s): min= 2858, max= 2992, per=100.00%, avg=2943.25, stdev=27.86, samples=59
iops : min= 2858, max= 2992, avg=2943.25, stdev=27.86, samples=59
lat (usec) : 250=66.17%, 500=0.01%, 750=33.33%, 1000=0.01%
lat (msec) : 2=0.32%, 4=0.16%
cpu : usr=2.57%, sys=13.38%, ctx=88256, majf=0, minf=6
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=0,88208,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=32
Run status group 0 (all jobs):
WRITE: bw=2940MiB/s (3083MB/s), 2940MiB/s-2940MiB/s (3083MB/s-3083MB/s), io=86.1GiB (92.5GB), run=30001-30001msec
Disk stats (read/write):
dm-2: ios=0/87854, sectors=0/179902504, merge=0/0, ticks=0/19604, in_queue=19604, util=65.42%, aggrios=0/705804, aggsectors=0/180651424, aggrmerge=0/0, aggrticks=0/57168, aggrin_queue=57168, aggrutil=64.74%
md1: ios=0/705804, sectors=0/180651424, merge=0/0, ticks=0/57168, in_queue=57168, util=64.74%, aggrios=0/117619, aggsectors=0/30108570, aggrmerge=0/14, aggrticks=0/18083, aggrin_queue=18083, aggrutil=43.24%
nvme1n1: ios=0/117617, sectors=0/30109704, merge=0/4, ticks=0/12824, in_queue=12824, util=7.39%
nvme5n1: ios=0/117610, sectors=0/30105712, merge=0/1, ticks=0/44537, in_queue=44537, util=43.24%
nvme2n1: ios=0/117610, sectors=0/30106168, merge=0/61, ticks=0/14725, in_queue=14725, util=7.29%
nvme3n1: ios=0/117625, sectors=0/30109768, merge=0/4, ticks=0/13479, in_queue=13478, util=7.64%
nvme0n1: ios=0/117626, sectors=0/30110240, merge=0/17, ticks=0/10437, in_queue=10438, util=6.08%
nvme4n1: ios=0/117627, sectors=0/30109832, merge=0/2, ticks=0/12499, in_queue=12500, util=9.68%
```