Eu tenho um servidor que está fazendo uma exportação do NFSv4 para os diretórios iniciais do usuário. Existem aproximadamente 25 usuários (principalmente desenvolvedores / analistas) e cerca de 40 servidores que montam a exportação do diretório base. O desempenho é miserável, com os usuários frequentemente vendo atrasos de vários segundos para comandos simples (como ls, ou escrevendo um pequeno arquivo de texto). Às vezes, a montagem do diretório inicial é interrompida por minutos , com os usuários recebendo erros de "permissão negada".
O hardware é um Dell R510 com CPUs E5620 duplas e 8 GB de RAM. Há oito unidades de 15k de 2,5 ”e 600 GB (Seagate ST3600057SS) configuradas no hardware RAID-6 com um único hot spare. O controlador RAID é um Dell PERC H700 com cache de 512 MB (o Linux vê isso como um LSI MegaSAS 9260). OS é o CentOS 5.6, a partição de diretório inicial é ext3, com opções “rw, data = journal, usrquota”.
Eu tenho o HW RAID configurado para apresentar dois discos virtuais para o sistema operacional: / dev / sda para o sistema operacional (inicialização, raiz e partições de troca) e / dev / sdb para os diretórios base.
O que eu acho curioso e desconfiado é que o dispositivo sda geralmente tem uma utilização muito alta, mesmo que contenha apenas o sistema operacional. Eu esperaria que este drive virtual ficasse ocioso quase o tempo todo. O sistema não está trocando, de acordo com "free" e "vmstat". Por que haveria grande carga neste dispositivo?
Aqui está um instantâneo de 30 segundos do iostat:
Time: 09:37:28 AM
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 44.09 0.03 107.76 0.13 607.40 11.27 0.89 8.27 7.27 78.35
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 44.09 0.03 107.76 0.13 607.40 11.27 0.89 8.27 7.27 78.35
sdb 0.00 2616.53 0.67 157.88 2.80 11098.83 140.04 8.57 54.08 4.21 66.68
sdb1 0.00 2616.53 0.67 157.88 2.80 11098.83 140.04 8.57 54.08 4.21 66.68
dm-0 0.00 0.00 0.03 151.82 0.13 607.26 8.00 1.25 8.23 5.16 78.35
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-2 0.00 0.00 0.67 2774.84 2.80 11099.37 8.00 474.30 170.89 0.24 66.84
dm-3 0.00 0.00 0.67 2774.84 2.80 11099.37 8.00 474.30 170.89 0.24 66.84
Parece que o iotop é a ferramenta ideal para descobrir esses tipos de problemas. Mas eu estou no CentOS 5.6, que não tem um kernel novo o suficiente para suportar esse programa.
Eu examinei Como determinar qual processo está causando E / S de disco pesado ? , e além do iotop, uma das sugestões dizia para fazer um "echo 1 > / proc / sys / vm / block_dump". Eu fiz isso (depois de direcionar mensagens do kernel para tempfs). Em cerca de 13 minutos, eu tinha cerca de 700k de leituras ou gravações, aproximadamente metade do kjournald e a outra metade do nfsd:
# egrep " kernel: .*(READ|WRITE)" messages | wc -l
768439
# egrep " kernel: kjournald.*(READ|WRITE)" messages | wc -l
403615
# egrep " kernel: nfsd.*(READ|WRITE)" messages | wc -l
314028
Por que vale a pena, durante a última hora, a utilização tem sido constantemente superior a 90% para a unidade de diretório inicial. Meu iostat de 30 segundos continua exibindo a saída assim:
Time: 09:36:30 PM
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 6.46 0.20 11.33 0.80 71.71 12.58 0.24 20.53 14.37 16.56
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 6.46 0.20 11.33 0.80 71.71 12.58 0.24 20.53 14.37 16.56
sdb 137.29 7.00 549.92 3.80 22817.19 43.19 82.57 3.02 5.45 1.74 96.32
sdb1 137.29 7.00 549.92 3.80 22817.19 43.19 82.57 3.02 5.45 1.74 96.32
dm-0 0.00 0.00 0.20 17.76 0.80 71.04 8.00 0.38 21.21 9.22 16.57
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-2 0.00 0.00 687.47 10.80 22817.19 43.19 65.48 4.62 6.61 1.43 99.81
dm-3 0.00 0.00 687.47 10.80 22817.19 43.19 65.48 4.62 6.61 1.43 99.82