자바 프로세스로 높은 CPU / IO에 매달려있는 PS AUX


13

Java 프로세스 및 nrpe 확인에 문제가 있습니다. 32 코어 시스템에서 때때로 1000 % CPU를 사용하는 일부 프로세스가 있습니다. 당신이 할 때까지 시스템은 꽤 반응합니다

ps aux 

또는 / proc / pid #에서 무언가를 시도하십시오.

[root@flume07.domain.com /proc/18679]# ls
hangs..

ps aux의 strace

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,

Java 프로세스가 작동하고 정상적으로 완료되지만 문제는 ps ​​aux가 완료되기를 기다리는 시간 초과로 인해 모니터링 프로세스가 중단되었다고 생각합니다.

나는 같은 것을 시도했다

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

운없이

편집하다

시스템 사양

  • 32 코어 Intel (R) Xeon (R) CPU E5-2650 0 @ 2.00GHz
  • 램 128gig
  • 12 4Tb 7200 드라이브
  • CentOS 6.5
  • 모델을 잘 모르겠지만 공급 업체는 SuperMicro입니다.

이런 일이 발생할 때의 부하는 1 분 동안 90-160ish 정도입니다.

이상한 부분은 다른 / proc / pid #에 들어갈 수 있으며 제대로 작동한다는 것입니다. 시스템은 내가 ssh 할 때 반응합니다. 우리가 고부하에 대해 경고를받을 때와 마찬가지로 나는 아주 잘 ssh 할 수 있습니다.

다른 편집

스케줄러에 마감일을 사용하고 있습니다

[root@dn07.domain.com ~]# 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

마운트는

[root@dn07.manage.com ~]# 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 tuned를 설치하려고 시도하고 처리 성능으로 설정했습니다.

[root@dn07.domain.com ~]# 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  ]

서버 환경에 대한 정보를 제공 할 수 있습니까? OS 배포 및 버전, 하드웨어 플랫폼이 적합합니다.
ewwhite

이 시점에서 시스템로드도 중요합니다.
ewwhite

나는 스펙과로드가 무엇인지 약간 수정했다
Mike

출력 결과는 mount어떻습니까?
ewwhite

아주 좋아요 tuned-adm profile enterprise-storagenobarrier 및 데드 라인 스위치를 처리하기 위해 명령 사용을 고려하십시오 . dmesg|tail출력 결과는 무엇입니까 ? I / O 시간 초과가 표시됩니까?
ewwhite

답변:


8

일반적으로, 나는 읽기가 멈추기 때문에 이런 일이 일어나는 것을 보았습니다. 이것은 strace출력 으로 확인됩니다 . ps aux명령을 실행하는 동안 / proc / xxxx / cmdline 파일을 읽으려고하면 정지 됩니다.

I / O의 급격한 증가로 시스템 리소스가 고갈되고 있습니다. 스토리지 서브 시스템과 관련하여 90-160의로드는 매우 나쁜 소식입니다.

스토리지 배열의 경우 하드웨어 RAID 컨트롤러가 있는지 알려줄 수 있습니까? 서버의 기본 응용 프로그램이 쓰기 바이어스되어 있습니까? 언급 한 디스크 (12 x 4TB)는 저속 니어 라인 SAS 또는 SATA 디스크입니다. 드라이브 어레이 앞에 쓰기 캐싱 형식이없는 경우 쓰기로 시스템로드를 높일 수 있습니다. Supermicro 백플레인의 순수 SATA 드라이브 인 경우 다른 디스크 문제 ( 시간 초과, 드라이브 고장, 백플레인 등 ) 의 가능성을 할인하지 마십시오 . 모든 Hadoop 노드에서 발생합니까?

쉬운 테스트는 iotop이것이 일어나는 동안 실행을 시도 하는 것입니다. 또한 이것이 EL6.5이므로 tuned-adm설정이 활성화되어 있습니까? 쓰기 장벽이 활성화되어 있습니까?

서버의 I / O 엘리베이터를 변경하지 않은 경우 ionice영향을 줄 수 있습니다. CFQ 이외의 다른 것으로 변경 한 경우 ( 이 서버는 마감일 이되어야 함 ) ionice아무런 차이가 없습니다.

편집하다:

프로덕션 환경에서 본 또 다른 이상한 것입니다. 이것들은 Java 프로세스이며, 다중 스레드라고 가정합니다. PID를 어떻게하고 있습니까? kernel.pid_maxsysctl값은 무엇입니까 ? 나는 전에 PID를 소진하고 그 결과 높은 부하를 겪은 상황을 겪었습니다.

또한 커널 버전 2.6.32-358.23.2.el6.x86_64에 대해 언급합니다 . 1 년이 넘었고 CentOS 6.4 릴리스의 일부이지만 나머지 서버는 6.5입니다. yum.conf에서 커널 업데이트를 차단 했습니까? 해당 시스템의 커널 2.6.32-431.xx 이상에 있어야합니다. 당신이 가지고있는 오래된 커널에 거대한 페이지 문제가있을 수 있습니다 . 커널을 변경할 수 없으면 다음과 같이 비활성화하십시오 :

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


RAID 카드가 있지만 서버에서 12 개의 드라이브를 처리하는 데 사용됩니다. Hadoop 클러스터의 일부이므로 많은 쓰기 작업을 수행하지만 실이 맵 감소 작업을 위해 많은 데이터를 가져올 때 이러한 잠금이 발생합니다.
Mike

데이터 센터에서 RAID 컨트롤러가 쓰기 캐시를 위해 무엇을 설정했는지 알기 위해 전화를 걸고 있습니다. 카드에 관해서는 3a0613065fa Adaptec \ 71605 \ SATA/SAS RAID 또한 SATA 드라이브임을 확인했습니다 Western Digital WD RE WD4000FYYZ
Mike

1
@mike 커널을 변경할 수 없으면 echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled영향을받는 컴퓨터에서 다음 을 시도하십시오 . 나는 이것이 당신 이이 설정으로 전후를 관찰 할 수있을 정도로 재현 가능하다고 가정합니다.
ewwhite

4
조정 된 것처럼 보이고 hugepage를 사용 중지하면 문제를 해결하는 데 도움이됩니다.
Mike

1
@ 마이크 우수. 커널 업데이트도 약간의 완화를 제공 할 수 있습니다. 그러나 실행중인 커널에 갇혀 있다면이 수정이 기쁘다.
ewwhite

3

디스크 관련 문제가 아닌 문제는 분명합니다. 그리고 이것은 교수형 strace에서 분명합니다.

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

/ proc은 커널과 사용자 공간 사이의 인터페이스입니다. 디스크를 전혀 건드리지 않습니다. 명령의 인수를 읽는 것이 중단 된 경우 일반적으로 커널 관련 문제이며 저장 문제는 아닙니다. @kasperd 의견을 참조하십시오.

로드는 문제의 부작용 일 뿐이며 높은 숫자는 전체 스토리를 나타내지 않습니다. 결함없이 응용 프로그램이 작동하는 서버의로드가 매우 높을 수 있습니다.

의 상황에 대한 자세한 정보를 얻을 수 있습니다 cat /proc/$PID/stack. $PID읽기가 중단되는 프로세스 ID는 어디에 있습니까 ?

귀하의 경우에는 커널 업그레이드로 시작합니다.


2
당신은 착각합니다. 읽음 /proc/%d/cmdline에 의해 리턴되는 것은 execve호출 중에 커널이 명령 행을 저장 한 프로세스 주소 공간의 일부입니다 . 사용자 공간의 다른 부분과 마찬가지로 스왑 아웃 될 수 있습니다. 따라서 페이지에 다시 액세스하기를 기다려야 할 수도 있습니다.
kasperd

이것은 매우 좋은 주장입니다. 일어나 주셔서 감사합니다. 그러나 스왑이 응답하지 않을 때 strace가 시작될 가능성은 낮지 만 불가능하지는 않다고 생각합니다. 답변을 업데이트하겠습니다.
Mircea Vutcovici

2

따라서 CentOS가 제공하는 모든 최신 조정 및 최신 2.6 커널로의 업그레이드에도 불구하고 우리는 여전히 멈췄습니다. 이전 만큼은 아니지만 여전히 봅니다.

이 문제는 CentOS가 centosplus 저장소에서 제공하는 3.10.x 시리즈 커널로 업그레이드하는 것이 었습니다.

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

이것은 모든 프로세스 트리 중단으로 사라졌습니다. 내가 말했듯이 시스템은 새로운 프로세스를 실행하는 것이 까다로워지지 않은 미친 부하를받지 못했습니다. 따라서 대부분 어딘가에 2.6 커널 문제가 있습니다.


0

이것은 또 다른 수정입니다.

다음과 같은 레이드 컨트롤러를 실행중인 것 같습니다.

Adaptec 71605

영향을받는 모든 시스템의 펌웨어를 최신 버전으로 업데이트하고 있으며 문제를 해결하고있는 것 같습니다.

CentOS 6에 3.10을 설치하는 다른 임의의 문제로 인해 3.10 커널 실험에서 다운 그레이드해야했지만 펌웨어 업그레이드로 문제가 해결 된 것으로 보입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.