RHEL6环境下透明大页和Hadoop高CPU sys

同学反馈hadoop运行在虚拟机中,出现非常异常的负载过高问题。一旦任务开始运行,系统立即卡得无法操作。

登录检查top,发现任务运行时,CPU主要消耗在system而不是计算的use,这说明存在什么程序异常,导致不断在内核态消耗系统资源,并没有正常在工作计算。

top - 15:52:28 up 1 day,  5:05,  7 users,  load average: 16.69, 5.96, 2.19
Tasks: 181 total,  16 running, 165 sleeping,   0 stopped,   0 zombie
Cpu0  :  5.9%us, 93.8%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.3%hi,  0.0%si,  0.0%st
Cpu1  :  3.6%us, 96.4%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  4.6%us, 95.4%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.3%us, 99.7%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8058056k total,  7476536k used,   581520k free,    37996k buffers
Swap:        0k total,        0k used,        0k free,  3225056k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  GROUP    P   TIME COMMAND
 2570 hadoop    20   0 4453m 648m  25m S  0.3  8.2  53:12.97 hadoop   2  53:12 java
 1843 hdfs      20   0 2767m 435m  28m S  0.0  5.5  16:52.01 hadoop   0  16:52 java
 2514 hadoop    20   0 2357m 424m  51m S  0.0  5.4   2:08.02 hadoop   3   2:08 java
 1748 hdfs      20   0 3899m 421m  28m S 18.7  5.4  89:12.91 hadoop   0  89:12 java
 2707 root      20   0 4603m 398m  52m S  0.6  5.1   2:51.18 root     1   2:51 java
 2490 hadoop    20   0 2261m 359m  50m S  0.0  4.6   2:37.18 hadoop   3   2:37 java
 1942 hadoop    20   0 4141m 344m  28m S  0.6  4.4  14:30.26 hadoop   3  14:30 java
 2940 hadoop    20   0 2819m 282m  28m S  0.3  3.6   7:10.89 hadoop   3   7:10 java
 4966 root      20   0 3686m 219m  14m S 14.1  2.8   0:51.95 root     1   0:51 java
19706 root      20   0 3027m 164m  13m S  0.3  2.1   2:09.46 root     1   2:09 java
 3097 hadoop    20   0 2746m 156m  27m S  0.0  2.0   1:27.23 hadoop   3   1:27 java
 5830 hadoop    20   0 2198m 107m  27m S 33.7  1.4   1:09.69 hadoop   0   1:09 java
27060 root      20   0  303m  75m 5200 S 18.4  1.0   7:05.99 root     3   7:05 ilogtail
 3043 hue       20   0 2710m  73m 5664 S  0.0  0.9   0:14.46 hue      1   0:14 hue
26082 ganglia   20   0  286m  37m 2556 R 17.8  0.5  68:19.41 ganglia  2  68:19 gmond
 1364 mysql     20   0  626m  28m 4344 S  0.0  0.4   0:31.21 mysql    3   0:31 mysqld
 2688 root      20   0  352m  14m 3440 S  0.3  0.2   0:51.18 root     0   0:51 supervisor
 3268 root      20   0  276m 9716 4940 S  0.0  0.1   0:03.76 root     3   0:03 httpd
 3170 ganglia   20   0  227m 9260 1348 S 19.3  0.1  41:04.32 ganglia  2  41:04 gmetad
 1438 root      20   0 81940 8952 5288 S  0.3  0.1   7:22.85 root     0   7:22 AliHids
27105 root      20   0  172m 7052 3084 S  0.0  0.1   5:01.65 root     0   5:01 python

上述任务运行起来时候,发现系统执行任何检查内存状态命令都很缓慢。例如vmstat时候,卡了好一会才开始有输出。但是vmstat输出可以看到,并没有很高的上下文切换

尝试用ps抓运行在队列中任务也不行,卡住没有任何输出。检查发现ps命令无法使用

原因是procfs无法访问,尝试cdproc中检查进程状态,发现也不能进入,长时间无输出。

google了一下,原来这个问题是RedHat Enterprise Linux 6的透明大页的bug Performance Issues with Transparent Huge Pages (THP) 。详细的排查方法,可以参考 Linux 6 Transparent Huge Pages and Hadoop Workloads

尝试关闭透明大页

检查当前THP状态,可以看到是始终打开的,我们现在关闭掉

关闭

然后重启emr-agent

此时再次观察,发现任务的还是没有解决问题

这个问题想尝试通过扩容内存和CPU来排查,采用XEN guest操作系统动态添加/移除内存或CPU为虚拟机扩容内存,从原先8G扩容到16G

不过,这个方法还没有做,先看看是哪个占用了sys

查找sys占用较高的进程

使用了一个比较土的方法,先把系统中所有正在运行的进程找出来

然后对每个进程使用pidstat命令,这样就可以看出是使用多少system

此时能够得到的信息类似

现在按照第5列(%system)排序进程

需要按照第4列(%system)排序就可以知道是哪个进程异常 (参考 Sort file according to the second column?)

可以看到占用处理器资源的情况主要集中在如下进程(第5列最大的值在最下面),其中异常的是gmond,占用了大量的system,但是缺没有us

gmond是集群监控系统ganglia的监控服务,google到 gmond occupying 100% of the CPU 在非多播环境中,gmond进程可能会导致系统CPU百分百占用掉。这种情况下,检查节点是否设置deaf(也就是节点是否接收任何节点的消息),设置

gmond occupying 100% of the CPU 文档提到 CentOS 6.5有这个现象,ubuntu也有

这个设置貌似有效,虽然还是没有完全解决问题,因为我设置以后再采用上述方法排查

看上去至少进程gmond已经不再大量消耗sys

strace

  • gmond进行 strace查看系统调用

显示输出

检查堆栈

显示输出

  • 看上去AliYunDun 1456 似乎也是一个问题

在没有运行java程序对时候显示如下

开始运行任务以后尝试strace云盾进程,发现这个进程不允许跟踪

开始运行任务以后显示

显示输出

  • 对java进程

strace对于java无效

java

jps

发现多个java进程都是等待在futex_wait_queue_me,搜索到[App hangs on futex_wait_queue_me() every a couple of minutes](App hangs on futex_wait_queue_me() every a couple of minutes) 说明:

CentOS 6的内核在运行java和多线程的程序会存在bug,升级到 2.6.32-504.16.2.el6.x86_64 后可以解决,具体的bug报告在 https://bugs.centos.org/view.php?id=8703 ,详细的问题解释在 futex: Ensure get_futex_key_refs() always implies a barrier

b0c29f7

升级CentOS 6内核 2.6.32-642.11.1.el6 升级以后同样的任务调度不再出现异常的sys使用率。

观察 java 进程的stack,依然是相同的函数,但是没有任何阻塞

参考

Last updated

Was this helpful?