ps aux挂在高CPU / IO与Java进程

我有一些与java进程和nrpe检查问题。 我们有一些进程有时在32核心系统上使用1000%的CPU。 该系统是非常敏感的,直到你做一个

ps aux 

或者尝试在/ proc / pid中做任何事情

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

一个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, 

Java进程正在工作,并将完成很好,但问题是这使得我们的监控疯狂思考过程中,因为它超时等待ps辅助完成。

我试过做类似的事情

  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
  • 128公斤的RAM
  • 12个4Tb 7200驱动器
  • CentOS 6.5
  • 我不确定模型,但供应商是SuperMicro

发生这种情况时的负载是1分钟90-160左右。

奇怪的是我可以进入任何其他/ proc / PID#它工作得很好。 系统是响应当我ssh英寸当我们得到警报的高负荷我可以ssh正确的罚款。

另一个编辑

我一直在使用调度程序的截止date

 [[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 

山看起来像

 [[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) 

好吧,我试图安装调整,并设置为吞吐量性能。

 [[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 ] 

    一般来说,我已经看到这种情况发生,因为一个停滞阅读。 这是由strace输出确认的。 当您运行ps aux命令时,尝试读取/ proc / xxxx / cmdline文件。

    I / O中的瞬间高峰正在使系统的资源匮乏。 如果存储子系统相关的话,90-160的负载是非常糟糕的消息。

    对于存储arrays,您能告诉我们是否有硬件RAID控制器? 服务器上的主要应用程序是否有偏写? 您提到的磁盘(12 x 4 TB)是较低速的近线SAS或SATA磁盘。 如果在驱动器arrays前没有写caching的forms,写操作能够推动系统负载。 如果这些是Supermicro背板上的纯SATA驱动器,请不要忽略其他磁盘问题 ( 超时,驱动器故障,底板等 )的可能性 是否在所有Hadoop节点上都发生这种情况?

    一个简单的testing就是在发生这种情况时尝试运行iotop 。 此外,由于这是EL6.5,你有任何的tuned-adm设置启用? 是否启用了写入屏障?

    如果你没有改变服务器的I / O电梯, ionice可能会有影响。 如果您已将其更改为CFQ之外的任何其他内容( 此服务器应该在截止date之前 ),则ionice不会有任何区别。

    编辑:

    在生产环境中看到的另一个奇怪的事情。 这些是Java进程,我会假设他们是multithreading的。 你如何做PID? kernel.pid_maxsysctl值是多less ? 我曾经遇到过以前耗尽PID的情况,并导致高负载。

    另外,你提到内核版本2.6.32-358.23.2.el6.x86_64 。 这已经一年多了,是CentOS 6.4版本的一部分,但是其他的服务器是6.5。 你有没有在yum.conf中黑名单内核更新? 你可能应该在内核2.6.32-431.xx或更新的系统。 旧的内核可能会有一个巨大的页面问题 。 如果您不能更改内核,请尝试禁用它们:

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

    问题很明显不是磁盘相关的问题。 绞死的这一点很明显:

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

    / proc是内核和用户空间之间的接口。 它根本不接触磁盘。 如果某些东西被绞死,读取命令的参数通常是一个内核相关的问题,而不是一个存储的问题。 请参阅@kasperd评论。

    负载只是问题的一个副作用,高数字并不能说明问题的全部。 你可以有一个非常高负载的应用程序的行为没有任何故障的服务器。

    您可以获得有关cat /proc/$PID/stack发生了什么的更多信息。 其中$PID是读取失败的进程ID。

    在你的情况下,我将开始一个内核升级。

    所以即使所有的调整和升级到CentOS提供的最新的2.6内核,我们仍然看到挂起。 还不如以前,但仍然看到他们。

    修正是升级到CentOS在centosplus repo中提供的3.10.x系列内核

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

    这已经消除了所有的进程树挂起。 就像我说的那样,这个系统没有任何疯狂的负载,运行新的进程并不快。 所以大部分是2.6内核的问题。

    这是另一个修复。

    看起来我们正在运行下面的RAID控制器

     Adaptec 71605 

    我一直在做所有受影响的机器的固件更新到最新版本,它似乎是清除问题。

    由于在CentOS 6上安装3.10的其他随机问题,我们不得不从3.10内核实验降级,但固件升级似乎解决了这个问题。