JPS&内存清理机制

本文介绍了Linux系统下使用jps命令查看Java进程的方法及其局限性,指出jps只能表明进程文件存在,并非确认进程实际运行状态。详细解析了通过ps命令检查进程是否存在以及进程被杀死的可能原因——OOM-kill机制,并展示了如何查看和避免该机制的影响。此外,还讨论了Linux系统的/tmp清理机制,以及如何调整以防止Java进程pid文件被误删,确保进程稳定运行。
摘要由CSDN通过智能技术生成

一、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 221 14:06 hadoop-root-datanode.pid
-rw-r--r--. 1 root root 5 221 14:06 hadoop-root-namenode.pid
-rw-r--r--. 1 root root 5 221 14:06 hadoop-root-secondarynamenode.pid
-rw-r--r--. 1 root root 5 221 14:07 yarn-root-nodemanager.pid
-rw-r--r--. 1 root root 5 221 14:07 yarn-root-resourcemanager.pid
[root@Hadoop01 pid]# cat hadoop-root-namenode.pid
8026
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值