Proxmox setup

This commit is contained in:
Sergey Mazein
2025-10-24 23:41:39 +03:00
parent 98dfb2fc03
commit abac396487
5 changed files with 734 additions and 22 deletions
+302
View File
@@ -0,0 +1,302 @@
# Вариант 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
```
и заверши эти процессы.
# создать том заново на всей свободной области
# создать том заново на всей свободной области
lvcreate -n data -l 100%FREE vg0
mkfs.xfs -f -s size=4096 -l size=256m -n size=4096 /dev/vg0/data
# подключить
mkdir -p /var/lib/vz
echo '/dev/vg0/data /var/lib/vz xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 2' >> /etc/fstab
mount -a
# XFS с адекватными настройками
mkfs.xfs -f -s size=4096 -l size=256m -n size=4096 /dev/vg0/data
# подключить
mkdir -p /var/lib/vz
echo '/dev/vg0/data /var/lib/vz xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 2' >> /etc/fstab
mount -a
mkfs.xfs -f -m reflink=1,crc=1 -l size=1536m,version=2,lazy-count=1 -n size=4096 -d su=512k,sw=8,agcount=64 /dev/vg0/data
---
### 3. Пересоздай файловую систему XFS
Оптимальные параметры для RAID0 с chunk = 1 Mb и 6 дисков для блокчейнов:
```bash
mkfs.xfs -f -s size=4096 -l size=256m -n size=4096 -d su=1m,sw=6 /dev/vg0/data
```
---
### 4. Смонтируй том обратно
```bash
mount /dev/vg0/data /var/lib/vz
```
---
### 5. Обнови `/etc/fstab`
Добавь (или замени существующую) строку:
```
/dev/vg0/data /var/lib/vz xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 2
```
добавить автоматически и применить
```
mkdir -p /var/lib/vz
UUID=$(blkid -s UUID -o value /dev/vg0/data)
echo "UUID=$UUID /var/lib/vz xfs defaults,noatime,nodiratime,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 (6×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/mapper/vg0-data 21T 410G 21T 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/md1/queue/read_ahead_kb
for d in /sys/block/nvme*n1/queue/read_ahead_kb; do echo 2048 | sudo tee "$d"; done
systemctl enable --now irqbalance
```
💾 3. Применение постоянных значений
Чтобы после перезагрузки не сбрасывались, добавь в /etc/rc.local или systemd-юнит, например:
```bash
cat >/usr/local/sbin/raid-tuning.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
# RAID-масив(ы): ставим 4 MiB
for f in /sys/block/md*/queue/read_ahead_kb; do
[ -e "$f" ] && echo 4096 > "$f"
done
# NVMe-диски: ставим 2 MiB
for f in /sys/block/nvme*n1/queue/read_ahead_kb; do
[ -e "$f" ] && echo 2048 > "$f"
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=local-fs.target
[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 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%
```
+282
View File
@@ -0,0 +1,282 @@
# Вариант 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 -m reflink=1,crc=1 -l size=1536m,version=2,lazy-count=1 -n size=4096 -d su=1m,sw=8,agcount=64 /dev/vg0/data
```
---
### 4. Смонтируй том обратно
```bash
mount /dev/vg0/data /var/lib/vz
```
---
### 5. Обнови `/etc/fstab`
Добавь (или замени существующую) строку:
```
/dev/vg0/data /var/lib/vz xfs defaults,noatime,logbufs=8,inode64,allocsize=1M,pquota 0 0
```
добавить автоматически и применить
```
mkdir -p /var/lib/vz
UUID=$(blkid -s UUID -o value /dev/vg0/data)
echo "UUID=$UUID /var/lib/vz xfs defaults,noatime,logbufs=8,inode64,allocsize=1M,pquota 0 0" >> /etc/fstab
mount -a
```
### 6. Перезапусти службы Proxmox
```bash
systemctl start pve-cluster pvedaemon pve-storage pveproxy
```
---
## ✅ Результат
После выполнения этих шагов:
- `/var/lib/vz` будет чистой, новой XFS-файловой системой,
оптимизированной под RAID0 (6×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/mapper/vg0-data 21T 410G 21T 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
systemctl enable --now irqbalance
```
💾 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 irqbalance
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%
```
View File
+4 -22
View File
@@ -23,33 +23,14 @@ PART /boot ext4 1024M
PART lvm vg0 all PART lvm vg0 all
LV vg0 root / ext4 20G LV vg0 root / ext4 20G
LV vg0 swap swap swap 8G LV vg0 swap swap swap 24G
LV vg0 data /var/lib/vz ext4 all LV vg0 data /var/lib/vz xfs all
# List images with ls /root/.oldroot/nfs/install/../images # List images with ls /root/.oldroot/nfs/install/../images
IMAGE /root/.oldroot/nfs/install/../images/Debian-1107-bullseye-amd64-base.tar.gz IMAGE /root/.oldroot/nfs/install/../images/Debian-1107-bullseye-amd64-base.tar.gz
``` ```
Разметка диска, настраиваем RAID0 (так было в prox7)
```
DRIVE1 /dev/nvme0n1
DRIVE2 /dev/nvme1n1
SWRAID 1
SWRAIDLEVEL 0 # Use 1 for Raid 1
BOOTLOADER grub
HOSTNAME prox7 # Set correct hostname
PART /boot ext4 1024M
PART lvm vg0 all
LV vg0 root / ext4 20G
LV vg0 swap swap swap 8G
LV vg0 data /var/lib/vz ext4 all # or ext4 300G
# List images with ls /root/.oldroot/nfs/install/../images
IMAGE /root/.oldroot/nfs/install/../images/Debian-1105-bullseye-amd64-base.tar.gz
```
Настройка сети с NAT и мрашрутизацией для виртуалных машин. Настройка сети с NAT и мрашрутизацией для виртуалных машин.
Взято тут Взято тут
https://adminwin.ru/nastroyka-nat-dlya-virtualynh-mashin-proxmox/ https://adminwin.ru/nastroyka-nat-dlya-virtualynh-mashin-proxmox/
@@ -209,4 +190,5 @@ ip_forward=1 Всегда включать
шаблон 500.conf (или net0) без firewall шаблон 500.conf (или net0) без firewall
команду на быструю проверку сети внутри LXC команду на быструю проверку сети внутри LXC
``` ```
+146
View File
@@ -0,0 +1,146 @@
nano nvme_linkcheck.sh
```bash
#!/usr/bin/env bash
# nvme_linkcheck.sh — сводка по PCIe-линкам NVMe (скорость, ширина, cap/sta) + авто-вердикт.
# Требуется: bash, awk, sed, grep -P, lspci (pciutils). Желательно доступ к /sys.
# Цель по умолчанию: Gen4 x4 (16.0 GT/s, x4). Переопределить: TARGET_SPEED_GT=8.0 TARGET_WIDTH=4
set -euo pipefail
# ---------- Конфиг ----------
TARGET_SPEED_GT="${TARGET_SPEED_GT:-16.0}" # требуемая скорость в GT/s
TARGET_WIDTH="${TARGET_WIDTH:-4}" # требуемая ширина (xN)
COLOR="${COLOR:-auto}" # auto|1|0 — цветной вывод
# -----------------------------
need() { command -v "$1" >/dev/null 2>&1 || { echo "ERROR: '$1' not found. Install it."; exit 2; }; }
need lspci
need awk
need sed
need grep
# Цвета
is_tty=0; [[ -t 1 ]] && is_tty=1
if { [[ "$COLOR" == "1" ]] || { [[ "$COLOR" == "auto" ]] && [[ $is_tty -eq 1 ]]; }; }; then
C_OK="\033[1;32m"; C_WARN="\033[1;33m"; C_ERR="\033[1;31m"; C_DIM="\033[2m"; C_CLR="\033[0m"
else
C_OK=""; C_WARN=""; C_ERR=""; C_DIM=""; C_CLR=""
fi
hr() { printf "%s\n" "--------------------------------------------------------------------------------"; }
fmt_pad() { printf "%-6s | %-28s | %-12s | %-12s | %-4s | %-26s | %-26s | %s\n" "$@"; }
# Точные парсеры из LnkCap/LnkSta
extract_speed_gt() { # "LnkSta: Speed 16GT/s, Width x4" -> 16 or 16.0
grep -Po 'Speed\s+\K[0-9]+(\.[0-9]+)?(?=GT/s)' <<<"$1" 2>/dev/null || true
}
extract_width() { # "LnkSta: Speed 16GT/s, Width x4" -> 4
grep -Po 'Width\s+x\K[0-9]+' <<<"$1" 2>/dev/null || true
}
# Безопасные парсеры из sysfs
parse_speed_num() { awk '{for(i=1;i<=NF;i++) if($i ~ /^[0-9]+(\.[0-9]+)?$/){print $i; exit}}' <<<"$1"; }
parse_width_num() { sed -E 's/.*x?([0-9]+).*/\1/' <<<"$1"; }
get_lnkcap_sta() {
local pci="$1"
lspci -s "$pci" -vv 2>/dev/null | awk '
/LnkCap:/ && cap=="" {cap=$0}
/LnkSta:/ && sta=="" {sta=$0}
END{print cap"\n"sta}'
}
problems=0
printf "NVMe PCIe link check (target: %s GT/s, x%s)\n" "$TARGET_SPEED_GT" "$TARGET_WIDTH"
hr
fmt_pad "NVMe" "Model" "PCI" "CurSpeed" "xW" "LnkCap" "LnkSta" "Verdict"
hr
shopt -s nullglob
found_any=0
for d in /sys/class/nvme/nvme*; do
found_any=1
ctrl="$(basename "$d")"
# Модель
model="n/a"
[[ -r "$d/model" ]] && model="$(tr -d '\n' < "$d/model" | sed -E 's/[[:space:]]+$//; s/[[:space:]]{2,}/ /g')"
# PCI-адрес
pci="$(readlink -f "$d/device" | awk -F/ '{print $NF}')"
if [[ -z "${pci}" ]]; then
fmt_pad "$ctrl" "$model" "?" "?" "?" "?" "?" "${C_ERR}MISSING${C_CLR}"
problems=$((problems+1))
continue
fi
# Текущие скорость/ширина из sysfs
cur_speed="$(cat "/sys/bus/pci/devices/$pci/current_link_speed" 2>/dev/null || echo "n/a")"
cur_width="$(cat "/sys/bus/pci/devices/$pci/current_link_width" 2>/dev/null || echo "n/a")"
cur_speed_num="$(parse_speed_num "$cur_speed" || true)"
cur_width_num="$(parse_width_num "$cur_width" || true)"
# LnkCap / LnkSta из lspci
readarray -t capsta < <(get_lnkcap_sta "$pci")
lnkcap="${capsta[0]:-n/a}"
lnksta="${capsta[1]:-n/a}"
cap_speed_num="$(extract_speed_gt "$lnkcap")"
cap_width_num="$(extract_width "$lnkcap")"
sta_speed_num="$(extract_speed_gt "$lnksta")"
sta_width_num="$(extract_width "$lnksta")"
# Статус (по умолчанию OK)
status="OK"
# LIMITED, если сам порт не поддерживает цель (cap ниже цели)
if [[ -z "$cap_speed_num" || -z "$cap_width_num" ]]; then
status="MISSING"
else
awk -v cap_s="$cap_speed_num" -v cap_w="$cap_width_num" -v tgt_s="$TARGET_SPEED_GT" -v tgt_w="$TARGET_WIDTH" '
BEGIN { if (cap_s+0.0 < tgt_s+0.0001 || cap_w+0 < tgt_w) exit 42; else exit 0 }' \
|| status="LIMITED"
fi
# DOWNGRADED, если cap ок, но sta/current ниже цели
if [[ "$status" == "OK" ]]; then
awk -v sta_s="${sta_speed_num:-0}" -v sta_w="${sta_width_num:-0}" \
-v cur_s="${cur_speed_num:-0}" -v cur_w="${cur_width_num:-0}" \
-v tgt_s="$TARGET_SPEED_GT" -v tgt_w="$TARGET_WIDTH" '
BEGIN {
if (sta_s+0.0 < tgt_s+0.0001 || sta_w+0 < tgt_w ||
cur_s+0.0 < tgt_s+0.0001 || cur_w+0 < tgt_w) exit 24;
else exit 0;
}' || status="DOWNGRADED"
fi
case "$status" in
OK) verdict="${C_OK}OK${C_CLR}" ;;
LIMITED) verdict="${C_WARN}LIMITED${C_CLR} (cap < target)"; problems=$((problems+1)) ;;
DOWNGRADED)verdict="${C_WARN}DOWNGRADED${C_CLR}"; problems=$((problems+1)) ;;
MISSING|*) verdict="${C_ERR}MISSING${C_CLR}"; problems=$((problems+1)) ;;
esac
# Компактный вывод cap/sta
short_cap="Speed $(extract_speed_gt "$lnkcap")GT/s, x$(extract_width "$lnkcap")"
short_sta="Speed $(extract_speed_gt "$lnksta")GT/s, x$(extract_width "$lnksta")"
fmt_pad "$ctrl" "$model" "$pci" "$cur_speed" "$cur_width" "$short_cap" "$short_sta" "$verdict"
done
if [[ $found_any -eq 0 ]]; then
echo "No NVMe controllers found under /sys/class/nvme"
exit 3
fi
hr
if [[ "$problems" -gt 0 ]]; then
echo -e "${C_WARN}Warnings/Issues: ${problems}${C_CLR}"
echo -e "${C_DIM}Legend:${C_CLR}
${C_OK}OK${C_CLR} — соответствует цели (>= ${TARGET_SPEED_GT} GT/s, x${TARGET_WIDTH})
${C_WARN}DOWNGRADED${C_CLR} — порт способен на большее (cap ок), но текущее/статус ниже цели
${C_WARN}LIMITED${C_CLR} — аппаратное ограничение (cap ниже цели)
MISSING — нет данных из sysfs/lspci"
exit 1
else
echo -e "${C_OK}All NVMe links meet the target (${TARGET_SPEED_GT} GT/s, x${TARGET_WIDTH}).${C_CLR}"
fi
```