Jak poprawić wydajność dysku serwera

10

Mam HP Microserver z systemem Ubuntu 10.04 LTS. Jest to serwer o niskiej mocy z 5 wewnętrznymi wnękami na dyski. Używam go do tworzenia kopii zapasowych moich zdalnych serwerów, VPS i lokalnych laptopów przez sieć. Chcę uzyskać najlepszą wydajność z dysków, ale nie wiem, czy jest optymalnie skonfigurowany, więc szukam porady.

Mój serwer uruchamia rsnapshot wiele razy dziennie, aby wykonać kopię zapasową zdalnych hostów. Faktyczna część przyrostowa zajmuje bardzo mało czasu. Znaczny czas poświęca się na takie rzeczy jak:

/bin/cp -al /srv/rsnapshot/hourly.0 /srv/rsnapshot/hourly.1

Co zajmuje około 2 godzin. Zdaję sobie sprawę, że są tam małe pliki bazillionów.

$ sudo du -hs hourly.1
659G    hourly.1

Również gdy rsnapshot usuwa starą kopię zapasową, może to zająć dużo czasu: -

/bin/rm -rf /srv/rsnapshot/daily.6/

Co zajmuje około pół godziny.

Moje pytania są następujące, konfiguracja serwera i niektóre statystyki IO są wyszczególnione poniżej. W razie potrzeby mogę oczywiście podać więcej informacji debugowania: -

Jak mogę określić, gdzie są wąskie gardła?

Czy osiągam granice tego, co jest w stanie (pod względem IO) dzięki temu urządzeniu?

Czy mogę wprowadzić jakieś poprawki wydajności?

Czy powinienem użyć innego poziomu RAID?

Czy miałoby sens zamiana dwóch wewnętrznych dysków RAID (połowa każdego lustra) z dwiema „innymi połówkami drugiego lustra” w macierzy zewnętrznej?

Uwaga: Nie jestem skłonny do robienia rzeczy takich jak kompilowanie własnego jądra. Idealnie chciałbym trzymać się 10.04 LTS, chyba że w późniejszych wersjach jest jakaś magia, która sprawia, że ​​wszystko działa o wiele szybciej.

Wewnętrznie serwer ma dysk rozruchowy SATA 1x160 GB i dyski 4x2 TB: -

Disk /dev/sde: 160.0 GB, 160041885696 bytes
Disk /dev/sdf: 2000.4 GB, 2000398934016 bytes
Disk /dev/sdh: 2000.4 GB, 2000398934016 bytes
Disk /dev/sdi: 2000.4 GB, 2000398934016 bytes
Disk /dev/sdg: 2000.4 GB, 2000398934016 bytes

Cztery wewnętrzne dyski 2 TB są w konfiguracji programowej MD RAID10: -

md0 : active raid10 sdg1[3] sdh1[0] sdi1[2] sdf1[1]
      3907023872 blocks 64K chunks 2 near-copies [4/4] [UUUU]

Dodatkowo mam zewnętrzną obudowę napędu EDGE10, która jest podłączona za pomocą karty PCI-E eSATA i zawiera cztery kolejne dyski o pojemności 500 GB: -

Disk /dev/sda: 500.1 GB, 500107862016 bytes
Disk /dev/sdb: 500.1 GB, 500107862016 bytes
Disk /dev/sdc: 500.1 GB, 500107862016 bytes
Disk /dev/sdd: 500.1 GB, 500107862016 bytes

Jest to również konfigurowane jako macierz MD RAID10

md1 : active raid10 sdb1[1] sda1[0] sdd1[3] sdc1[2]
      976767872 blocks 64K chunks 2 near-copies [4/4] [UUUU]

md0 i md1 są łączone, aby utworzyć jeden duży LVM. Uwaga: Dopiero niedawno dodałem tablicę zewnętrzną, więc jest prawie pusta, nie sądzę, aby były w niej teraz jakieś bloki.

Jest to prezentowane jako wolumin LVM:

--- Logical volume ---
LV Name                /dev/data/data
VG Name                data
LV UUID                amZCgU-sQLi-R363-dUFx-Bcdf-iwlt-ZNnDp8
LV Write Access        read/write
LV Status              available
# open                 1
LV Size                4.54 TiB
Current LE             1190134
Segments               2
Allocation             inherit
Read ahead sectors     auto
- currently set to     512
Block device           251:0

Który jest sformatowany jako EXT4 i zamontowany jako / srv: -

/dev/mapper/data-data on /srv type ext4 (rw)

Jest dużo wolnego miejsca.

/dev/mapper/data-data
                      4.5T  2.2T  2.1T  51% /srv

Inne informacje, które mogą być przydatne: -

$ uname -a
Linux ubuntuserver 2.6.32-32-server #62-Ubuntu SMP Wed Apr 20 22:07:43 UTC 2011 x86_64 GNU/Linux

.

00:11.0 SATA controller: ATI Technologies Inc SB700/SB800 SATA Controller [AHCI mode] (rev 40)
02:00.0 RAID bus controller: Silicon Image, Inc. SiI 3132 Serial ATA Raid II Controller (rev 01)

Podczas wykonywania polecenia cp podczas rsnapshot widzę w iostacie:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.55    0.00    5.47   66.14    0.00   27.85

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdc               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdd               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sde               0.00     0.00    0.10    0.00     0.80     0.00     8.00     0.00    0.00   0.00   0.00
sdf               0.00   407.50    0.00   66.80     0.00  3790.40    56.74   124.86 1524.88  13.55  90.50
sdh               0.00   406.90    0.00   66.90     0.00  3790.40    56.66    92.89 1230.52  13.21  88.40
sdi               0.00   407.80    5.50   70.20    44.00  3824.00    51.10   113.83 1333.84  12.34  93.40
sdg               0.00   406.80    6.10   71.60    48.80  3827.20    49.88    64.32  787.68  11.69  90.80
md0               0.00     0.00   11.50 1484.60    92.00 11876.80     8.00     0.00    0.00   0.00   0.00
dm-0              0.00     0.00   11.50 1484.70    92.00 11877.60     8.00  5331.18  471.91   0.63  94.70
md1               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

W zasadzie dużo zapisów, dużo IO czeka.

Więc teraz pudełko jest bezczynne, zawiesiłem wszystkie zadania.

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    0.00    0.00  100.00

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdc               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdd               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sde               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdf               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdh               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdi               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdg               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
md0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
md1               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

Wygląda brzoskwiniowo!

$ sudo hdparm -T -t /dev/sd[a-i]

/dev/sda:
 Timing cached reads:   2532 MB in  2.00 seconds = 1265.95 MB/sec
 Timing buffered disk reads:  270 MB in  3.02 seconds =  89.53 MB/sec

/dev/sdb:
 Timing cached reads:   2516 MB in  2.00 seconds = 1258.07 MB/sec
 Timing buffered disk reads:  264 MB in  3.02 seconds =  87.37 MB/sec

/dev/sdc:
 Timing cached reads:   2442 MB in  2.00 seconds = 1220.80 MB/sec
 Timing buffered disk reads:  272 MB in  3.00 seconds =  90.60 MB/sec

/dev/sdd:
 Timing cached reads:   2520 MB in  2.00 seconds = 1259.64 MB/sec
 Timing buffered disk reads:  272 MB in  3.02 seconds =  90.07 MB/sec

/dev/sde:
 Timing cached reads:   2524 MB in  2.00 seconds = 1261.48 MB/sec
 Timing buffered disk reads:  306 MB in  3.01 seconds = 101.56 MB/sec

/dev/sdf:
 Timing cached reads:   2366 MB in  2.00 seconds = 1183.28 MB/sec
 Timing buffered disk reads:  388 MB in  3.01 seconds = 128.88 MB/sec

/dev/sdg:
 Timing cached reads:   2536 MB in  2.00 seconds = 1267.52 MB/sec
 Timing buffered disk reads:  400 MB in  3.00 seconds = 133.12 MB/sec

/dev/sdh:
 Timing cached reads:   2538 MB in  2.00 seconds = 1269.08 MB/sec
 Timing buffered disk reads:  426 MB in  3.00 seconds = 141.90 MB/sec

/dev/sdi:
 Timing cached reads:   2538 MB in  2.00 seconds = 1268.57 MB/sec
 Timing buffered disk reads:  402 MB in  3.01 seconds = 133.69 MB/sec
Popey
źródło
Hmm Nienawidzę dzielenia struktur dyskowych na różne urządzenia, ponieważ sprawia to, że takie problemy są tak trudne do rozwiązania. Zwykle sugeruję uruchomienie czegoś takiego jak bonnie++na każdej macierzy osobno, aby uzyskać podstawowe testy porównawcze prędkości. Nie mam dużego doświadczenia z LVM, więc nie jestem pewien, czy ich oddzielenie jest teraz opcją.
Oli
Zewnętrzna tablica tak naprawdę nie stanowi problemu. Nie ma na tym żadnych bloków. Mam nadzieję, że to wydajność wewnętrznego dysku.
popey

Odpowiedzi:

3

Niestety pamięć podręczna pasków dotyczy tylko RAID5 i 6 - nie ma odpowiednika dla RAID 0/1/10.

Wydajność poszczególnych dysków (zgodnie z hdparm) wygląda dobrze - wszystkie działają zgodnie z oczekiwaniami dla dysków tej klasy.

Moje sugestie:

  1. Sprawdź, czy AHCI jest włączony w systemie BIOS i czy wewnętrznie zainstalowane dyski nie używają starszego trybu IDE. Dostępny jest zhakowany BIOS dla MicroServera, który również włącza AHCI również dla portu eSATA (zobacz ten link, aby uzyskać więcej informacji) - warto sprawdzić dyski w zewnętrznej obudowie, chociaż nadal będą one ograniczone przez to, że stoją za mnożnik portów.
  2. Włącz NCQ dla wszystkich napędów i sprawdź, czy to robi różnicę (może, ale nie musi).
  3. Upewnij się, że ustawienia systemu plików są zoptymalizowane (montowanie noatime, nodiratime). Możesz także wyłączyć bariery zapisu , ale może to być zbyt ryzykowne.
  4. Sprawdź, czy widzisz jakąkolwiek korzyść ze zmiany harmonogramu we / wy (noop może tutaj pomóc).
  5. Dostosuj bufor odczytu z wyprzedzeniem zarówno dla urządzeń md, jak i LVM: blockdev --setra <size> /dev/md1na przykład (gdzie <size>sektory mają 512 bajtów). Pomoże to jednak tylko czytać.

Dwie inne rzeczy, które mogą wpłynąć na wydajność, to wyrównanie partycji i parametry tworzenia systemu plików (krok itp.), Ale ponieważ używasz nowoczesnych narzędzi, nie powinno to stanowić problemu.

mjturner
źródło
Dodano czasy dysku hdparm i edytowałem fstab (i ponownie zamontowałem), aby używać noatime i nodiratime. Zostawi to tak 24 godziny.
popey