一、jps
jps在jdk下,用于查看java进程
[root@Hadoop01 ~]# which jps
/usr/java/jdk1.8.0_45/bin/jps
[root@Hadoop01 ~]# jps
4020 SecondaryNameNode
4308 NodeManager
4199 ResourceManager
4968 Jps
3801 DataNode
3690 NameNode
[root@Hadoop01 ~] jps -l
4020 org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
4308 org.apache.hadoop.yarn.server.nodemanager.NodeManager
4199 org.apache.hadoop.yarn.server.resourcemanager.ResourceManager
5048 sun.tools.jps.Jps
3801 org.apache.hadoop.hdfs.server.datanode.DataNode
3690 org.apache.hadoop.hdfs.server.namenode.NameNode
对应java进程的标识文件
路径:/tmp/hsperfdata_启动进程的用户名
- 进程所属的用户只能查看自己的进程信息
- root可查看所有进程信息,但显示进程不可用
- 把标识文件移走以后,jps就看不到相应进程了
当进程不可用或看不到进程的时候,这些进程真的不存在了吗?此时我们需要判断这些进程是否存在
#查看过滤掉查看进程命令本身的进程
ps -ef |grep 进程号 |grep -v grep
#查看进程数,若显示不为0,则说明进程存在
ps -ef |grep 进程号 |grep -v grep |wc -l
jps只是具有欺骗性,它只是显示进程文件是否存在的一种方式,不能确定进程是否真的存在
查看进程还是推荐使用ps -ef
示例:查看存放进程的文件
[root@Hadoop01 ~] ll /tmp/*hsperfdata_*
/tmp/hsperfdata_byy:
总用量 0
/tmp/hsperfdata_root: #root启动了进程,所以进程文件在root下
总用量 160
-rw-------. 1 root root 32768 2月 21 12:53 3690
-rw-------. 1 root root 32768 2月 21 12:53 3801
-rw-------. 1 root root 32768 2月 21 12:53 4020
-rw-------. 1 root root 32768 2月 21 12:53 4199
-rw-------. 1 root root 32768 2月 21 12:53 4308
[root@Hadoop01 ~] head /tmp/hsperfdata_root/3690
二、linux两种机制
oom-kill机制
当内存使用过高时,系统防止夯住,会自动杀掉内存使用最多的进程,所以当进程断掉时,先在日志中寻找error信息,若没有相关error信息,则排查是否是触发了oom-kill机制
- 查看是否有类killed process命令,若有则代表触发了oom机制
[root@Hadoop01 ~]# cat /var/log/messages |grep oom
- 查看内存使用情况
[root@Hadoop01 ~] free -h
total used free shared buff/cache available
Mem: 1.8G 1.6G 82M 11M 137M 72M
Swap: 2.0G 905M 1.1G
- 查看内存使用占比,找到内存使用率最高的进程
[root@Hadoop01 ~] top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4199 root 20 0 3020988 260672 4604 S 3.0 14.0 1:47.88 java
3073 root 9 -11 1285532 1228 580 S 1.3 0.1 0:02.63 pulseaudio
6357 root 20 0 162240 2428 1580 R 1.3 0.1 0:00.40 top
1 root 20 0 194320 4696 2424 S 1.0 0.3 0:04.97 systemd
440 root 20 0 39800 2820 2552 S 1.0 0.2 0:02.23 systemd-journal
1068 root 16 -4 55532 192 88 S 1.0 0.0 0:00.46 auditd
2907 root 20 0 3835280 79580 15324 S 1.0 4.3 0:14.89 gnome-shell
4308 root 20 0 2918220 244620 3928 S 1.0 13.1 0:51.33 java
1105 dbus 20 0 71060 2812 784 S 0.7 0.2 0:02.84 dbus-daemon
1145 polkitd 20 0 616436 1704 1000 S 0.7 0.1 0:01.95 polkitd
1150 root 20 0 26428 1008 808 S 0.7 0.1 0:00.71 systemd-logind
3230 root 20 0 608636 2468 476 S 0.7 0.1 0:10.37 vmtoolsd
3294 root 20 0 84.6g 37712 1616 S 0.7 2.0 0:24.53 WebKitWebProces
3801 root 20 0 2861144 176252 3992 S 0.7 9.5 0:28.26 java
1102 root 20 0 295564 1504 1136 S 0.3 0.1 0:11.98 vmtoolsd
1103 avahi 20 0 62264 716 516 S 0.3 0.0 0:01.08 avahi-daemon
1730 root 20 0 378404 14124 7936 S 0.3 0.8 0:01.92 X
1875 mysql 20 0 974812 512 0 S 0.3 0.0 0:10.17 mysqld
2526 root 20 0 398900 816 428 S 0.3 0.0 0:00.17 boltd
2623 root 20 0 254572 36 0 S 0.3 0.0 0:11.94 pcscd
3175 root 20 0 98.3g 8716 2424 S 0.3 0.5 0:06.26 yelp
3410 root 20 0 586548 660 96 S 0.3 0.0 0:01.19 fwupd
3690 root 20 0 2883556 271412 3380 S 0.3 14.6 0:45.35 java
clean机制
linux系统的/tmp是一个临时目录,会以一定规则自动清理/tmp底下的文件。
当我们的Java进程启动或停止时,pid进程文件会自动在/tmp底下生成或清除。
那么有一个问题,当我们的进程启动时间大于/tmp路径文件的自动清理时间,我们就无法正常关掉进程(因为进程还未启动,pid文件已经被清理)。
此时有两种办法来解决这个问题:
1、重设/tmp路径底下的文件的自动清理规则
(1)查看/tmp底下文件的清理规则
[root@Hadoop01 ~]# cat /usr/lib/tmpfiles.d/tmp.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
# See tmpfiles.d(5) for details
# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d
# Exclude namespace mountpoints created with PrivateTmp=yes
x /tmp/systemd-private-%b-*
X /tmp/systemd-private-%b-*/tmp
x /var/tmp/systemd-private-%b-*
X /var/tmp/systemd-private-%b-*/tmp
- v /tmp 1777 root root 10d:每10天会自动清理掉/tmp底下的文件
- v:按照一定规则清理文件
- x:不会清理文件
(2)修改/tmp底下hadooop进程文件的清理规则
[root@Hadoop01 ~]# vim /usr/lib/tmpfiles.d/tmp.conf
编辑以下内容到文件最后一行
x /tmp/*hsperfdata_*
2、将java进程的pid文件存放在其他路径
(1)关掉hadoop进程
一定要先关掉hadoop进程,防止hadoop进程启动不全
[root@Hadoop01 ~]# stop-all.sh
(2)编辑配置文件,改变pid文件的存放位置
hadoop-env.sh
[root@Hadoop01 ~]# vim /opt/app/hadoop/etc/hadoop/hadoop-env.sh
编辑以下内容,改变pid文件的存放位置
# pid directory
export HADOOP_PID_DIR=/opt/app/hadoop/tmp/pid
yarn-env.sh
[root@Hadoop01 ~]# vim /opt/app/hadoop/etc/hadoop/yarn-env.sh
编辑以下内容,改变pid文件的存放位置
#yarn pid dir
export YARN_PID_DIR=/opt/app/hadoop/tmp/pid
(3)重启hadoop,查看进程pid文件是否保存在新路径
[root@Hadoop01 ~]# start-all.sh
[root@Hadoop01 ~]# jps
8162 DataNode
8341 SecondaryNameNode
8521 ResourceManager
8026 NameNode
8748 NodeManager
8975 Jps
[root@Hadoop01 ~]# cd /opt/app/hadoop/tmp/pid
[root@Hadoop01 pid]# ll
总用量 20
-rw-r--r--. 1 root root 5 2月 21 14:06 hadoop-root-datanode.pid
-rw-r--r--. 1 root root 5 2月 21 14:06 hadoop-root-namenode.pid
-rw-r--r--. 1 root root 5 2月 21 14:06 hadoop-root-secondarynamenode.pid
-rw-r--r--. 1 root root 5 2月 21 14:07 yarn-root-nodemanager.pid
-rw-r--r--. 1 root root 5 2月 21 14:07 yarn-root-resourcemanager.pid
[root@Hadoop01 pid]# cat hadoop-root-namenode.pid
8026