ps aux pendurado em alta cpu / IO com processos java

13

Estou tendo alguns problemas com o processo java e as verificações de nrpe. Temos alguns processos que às vezes usam 1000% da CPU em um sistema de 32 núcleos. O sistema é bastante responsivo até você fazer uma

ps aux 

ou tente fazer qualquer coisa no / proc / pid # como

[[email protected] /proc/18679]# ls
hangs..

Um traço de ps aux

stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2819, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2819, ...}) = 0
stat("/dev/pts1", 0x7fffb8526f00)       = -1 ENOENT (No such file or directory)
stat("/dev/pts", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
readlink("/proc/15693/fd/2", "/dev/pts/1", 127) = 10
stat("/dev/pts/1", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
write(1, "root     15693 15692  0 06:25 pt"..., 55root     15693 15692  0 06:25 pts/1    00:00:00 ps -Af
) = 55
stat("/proc/18679", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
open("/proc/18679/stat", O_RDONLY)      = 5
read(5, "18679 (java) S 1 18662 3738 3481"..., 1023) = 264
close(5)                                = 0
open("/proc/18679/status", O_RDONLY)    = 5
read(5, "Name:\tjava\nState:\tS (sleeping)\nT"..., 1023) = 889
close(5)                                = 0
open("/proc/18679/cmdline", O_RDONLY)   = 5
read(5,

o processo java está funcionando e será concluído muito bem, mas o problema é que faz com que nosso monitoramento fique louco, pois os processos estão inativos porque o tempo limite é aguardado até que um ps aux seja concluído.

Eu tentei fazer algo como

 nice -19 ionice -c1 /usr/lib64/nagios/plugins/check_procs -w 1:1 -c 1:1 -a 'diamond' -u root -t 30

sem sorte

EDITAR

Especificações do sistema

  • CPU de 32 núcleos Intel (R) Xeon (R) E5-2650 0 a 2.00GHz
  • 128gig de ram
  • 12 unidades de 4Tb 7200
  • CentOS 6.5
  • Não tenho certeza do modelo, mas o fornecedor é SuperMicro

A carga, quando isso acontece, fica em torno de 90 a 160 segundos por 1 minuto.

A parte estranha é que eu posso entrar em qualquer outro / proc / pid # e funciona muito bem. O sistema é responsivo quando eu desligo. Como quando somos alertados sobre a alta carga, eu posso deslocar corretamente.

Outra edição

Estou usando o prazo para agendador

[[email protected] ~]# for i in {a..m}; do cat /sys/block/sd${i}/queue/scheduler; done
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq

Mount parece

[[email protected] ~]# mount
/dev/sda3 on / type ext4 (rw,noatime,barrier=0)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext2 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/sdb1 on /disk1 type xfs (rw,nobarrier)
/dev/sdc1 on /disk2 type xfs (rw,nobarrier)
/dev/sdd1 on /disk3 type xfs (rw,nobarrier)
/dev/sde1 on /disk4 type xfs (rw,nobarrier)
/dev/sdf1 on /disk5 type xfs (rw,nobarrier)
/dev/sdg1 on /disk6 type xfs (rw,nobarrier)
/dev/sdh1 on /disk7 type xfs (rw,nobarrier)
/dev/sdi1 on /disk8 type xfs (rw,nobarrier)
/dev/sdj1 on /disk9 type xfs (rw,nobarrier)
/dev/sdk1 on /disk10 type xfs (rw,nobarrier)
/dev/sdl1 on /disk11 type xfs (rw,nobarrier)
/dev/sdm1 on /disk12 type xfs (rw,nobarrier)

Ok, tentei instalar o tuned e configurá-lo para o desempenho da taxa de transferência.

[[email protected] ~]# tuned-adm profile throughput-performance
Switching to profile 'throughput-performance'
Applying deadline elevator: sda sdb sdc sdd sde sdf sdg sdh[  OK  ] sdk sdl sdm
Applying ktune sysctl settings:
/etc/ktune.d/tunedadm.conf:                                [  OK  ]
Calling '/etc/ktune.d/tunedadm.sh start':                  [  OK  ]
Applying sysctl settings from /etc/sysctl.d/99-chef-attributes.conf
Applying sysctl settings from /etc/sysctl.conf
Starting tuned:                                            [  OK  ]
Mike
fonte
Você pode fornecer informações sobre o ambiente do servidor? A distribuição e versão do SO, plataforma de hardware seria relevante.
ewwhite
A carga do seu sistema no momento em que isso acontece também é importante.
ewwhite
Fiz algumas edições com especificações e qual é a carga #
3030 Mike
Como é a saída de mount?
ewwhite
Muito bom. Considere usar o tuned-adm profile enterprise-storagecomando para manipular a opção nobarrier e deadline. O que dmesg|tailmostra a saída? Você está vendo tempos limite de E / S?
ewwhite

Respostas:

8

Em geral, eu já vi isso acontecer por causa de uma leitura estagnada. Isso é confirmado pela sua stracesaída. A tentativa de ler o arquivo / proc / xxxx / cmdline trava enquanto você executa o ps auxcomando.

Os picos momentâneos de E / S estão consumindo os recursos do sistema. Uma carga de 90-160 é uma notícia extremamente ruim se estiver relacionada ao subsistema de armazenamento.

Para a matriz de armazenamento, você pode nos dizer se existe um controlador RAID de hardware? O aplicativo principal no servidor tem tendência de gravação? Os discos mencionados (12 x 4 TB) são discos SAS ou SATA nearline de menor velocidade. Se não houver nenhuma forma de armazenamento em cache de gravação na frente da matriz da unidade, as gravações serão capazes de aumentar a carga do sistema. Se forem unidades SATA puras em um backplane Supermicro, não descarte a possibilidade de outros problemas de disco ( tempos limite, falha na unidade, backplane etc. ) Isso acontece em todos os nós do Hadoop?

Um teste fácil é tentar executar iotopenquanto isso está acontecendo. Além disso, como esse é o EL6.5, você tem alguma das tuned-admconfigurações ativadas? As barreiras de gravação estão ativadas?

Se você não alterou o elevador de E / S do servidor, ionicepode ter um impacto. Se você o alterou para algo diferente de CFQ ( este servidor provavelmente deve estar dentro do prazo ), ionicenão fará diferença.

Editar:

Outra coisa estranha que eu já vi em ambientes de produção. Estes são processos Java, e eu presumo que eles sejam altamente multithread. Como você está no PIDs? Qual é o sysctlvalor para kernel.pid_max ? Já tive situações em que exaurei PIDs antes e tive uma carga alta resultante.

Além disso, você menciona a versão 2.6.32-358.23.2.el6.x86_64 do kernel . Isso tem mais de um ano e faz parte do lançamento do CentOS 6.4, mas o restante do servidor é 6.5. Você listou atualizações do kernel no yum.conf? Você provavelmente deveria estar no kernel 2.6.32-431.xx ou mais recente para esse sistema. Pode haver um problema de grandes páginas no kernel mais antigo que você possui . Se você não pode alterar o kernel, tente desabilitá-lo com:

echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled.

ewwhite
fonte
há uma placa de ataque, mas é usada apenas para manipular 12 unidades no servidor. Faz parte de um cluster do Hadoop, portanto, ele escreve bastante, mas esses bloqueios ocorrem quando o fio está puxando muitos dados para um trabalho de redução de mapa.
Mike
Estou pedindo que o datacenter me ligue para ver se eles sabem o que o controlador de ataque está definido para o cache de gravação. Quanto cartão é um 3a0613065fa Adaptec \ 71605 \ SATA/SAS RAID I verificado que eles são drives SATA também Western Digital WD RE WD4000FYYZ
Mike
1
@mike Se você não pode alterar o kernel, tente: echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabledem uma máquina afetada. Suponho que isso seja reproduzível o suficiente para que você possa observar um antes / depois com essa configuração.
ewwhite
4
parece que a página afinada e desativada ajudou a resolver o problema!
Mike
1
@ Mike Excelente. Uma atualização do kernel também pode fornecer algum alívio. Mas se você estiver com o kernel em execução, fico feliz que essa correção funcione.
ewwhite
3

O problema é claro, não um problema relacionado ao disco. E isso fica claro pelo traço pendurado:

open("/proc/18679/cmdline", O_RDONLY)   = 5
read(5,

/ proc é uma interface entre o kernel e o espaço do usuário. Não toca no disco. Se algo é travado ao ler os argumentos de um comando, geralmente é um problema relacionado ao kernel e improvável um problema de armazenamento. Veja o comentário @kasperd.

A carga é apenas um efeito colateral do problema e o número alto não conta a história completa. Você pode ter um servidor com carga muito alta, no qual o aplicativo se comporta sem nenhuma falha.

Você pode obter mais informações sobre o que está acontecendo cat /proc/$PID/stack. Onde $PIDestá o ID do processo em que a leitura é interrompida.

No seu caso, eu começaria com uma atualização do kernel.

Mircea Vutcovici
fonte
2
Você está enganado. O que é retornado pela leitura /proc/%d/cmdlineé a parte do espaço de endereço do processo no qual o kernel armazenou a linha de comando durante a execvechamada. Como qualquer outra parte do espaço do usuário, ele pode ser trocado. Portanto, acessá-lo pode realmente ter que esperar a página ser trocada novamente.
kasperd
Este é um argumento muito bom. Obrigado por se levantar. No entanto, acho que as chances de o strace começar quando seu swap não está respondendo são baixas, mas não impossíveis. Vou atualizar minha resposta.
Mircea Vutcovici
2

Portanto, mesmo com todos os ajustes e uma atualização para o kernel 2.6 mais recente fornecido pelo CentOS, ainda estávamos vendo as falhas. Não tanto quanto antes, mas ainda os vendo.

A correção foi atualizar para o kernel da série 3.10.x que o CentOS fornece em seu repositório centosplus aqui

http://mirror.centos.org/centos/6/xen4/x86_64/Packages/

Isso eliminou todos os travamentos da árvore de processos. Como eu disse, o sistema não estava sob nenhuma carga louca onde a execução de novos processos não era ágil. Portanto, a maioria deve ser um problema do kernel 2.6 em algum lugar.

Mike
fonte
0

Essa é outra correção.

Parece que estamos executando o seguinte controlador de invasão

Adaptec 71605

Venho fazendo atualizações de firmware em todas as máquinas afetadas para a versão mais recente e parece estar resolvendo o problema.

Tivemos que fazer o downgrade do experimento do kernel 3.10 devido a outros problemas aleatórios na instalação do 3.10 no CentOS 6, mas a atualização do firmware parece corrigir o problema.

Mike
fonte