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无法访问,尝试cd到proc中检查进程状态,发现也不能进入,长时间无输出。
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查看系统调用
显示输出
检查堆栈
显示输出
看上去
AliYunDun1456 似乎也是一个问题
在没有运行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
升级CentOS 6内核 2.6.32-642.11.1.el6 升级以后同样的任务调度不再出现异常的sys使用率。
观察 java 进程的stack,依然是相同的函数,但是没有任何阻塞
参考
Last updated
Was this helpful?