Tomcat 不正常挂掉原因(不定期更新)

  1. ueba.log 日志出现大量 init session ok: xxxxxxxxxxxxxxxx,几乎 1 秒钟好多条,这个会造成 tomcat 资源被大量占用,然后出现大量连接被重置异常,直到 tomcat 变成假死状态,重启后可恢复。
    这个 BUG 在 UEBA6.0 中是一直存在的,解决办法:
    1) 升级到 7.0
    2) 直接在 6.0 的客户端中修改,通过服务端升级功能升级客户端

  2. 日志中出现 OutOfMemoryError 异常
    这个是 tomcat 分配的运行内存不足,解决办法是修改 tomcat/bin/catalina.sh 文件:

    JAVA_OPTS="-Xms256m -Xmx1024m -server -XX:PermSize=128m -XX:MaxPermSize=512m"
    

    找到 JAVA_OPTS 参数进行修改,-Xms 是最小内存,-Xmx 是最大内存,具体后面给值多少由机器总内存大小来分配

  3. 日志中出现 Too many open files
    这个是由于我们系统安装没有修改 linux 系统最大文件打开数量导致的,由于 linux 这个参数最小值是 1024,远远不能满足我们系统运行要求,所以要修改。
    root 用户修改这个文件:

    vi /etc/security/limits.conf
    

    在最后加上两行,isearch 为系统安装用户,如果是 root 安装,直接写 root:

    isearch             -       nproc           10240
    isearch             -       nofile          65536
    

    保存文件后直接登陆 su - isearch,用命令查看是否生效:

    [isearch@isearch181:~]$ ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 46663
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 65536
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 10240
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 10240
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    

    最后要重启 tomcat

  4. 日志中出现 java.io.IOException: Connection reset by peer
    1) 有可能是 mysql 数据库有问题,导致程序不能正常连上 mysql, 检查 mysql 状态是否正常,用命令看是否能登陆进去
    2) 有可能是 elasticsearch 有问题,用 elasticsearch-head 可以查看 elasticsearch 是否正常
    3) 有可能是 solr 有问题, 用 solr 管理页面查看 solr 是否正常

  5. 如果 10080 页面不能访问,把 10080 端口换成 9080 试试,如果也不能访问,说明 tomcat 有问题,如果能访问,说明 nginx 有问题

  6. 用 df -h 命令查看系统硬盘是否被占满

  7. 命令查看是否某个 tomcat 进程 cpu 占用比很高,用下面的步骤来查看是否是 tomcat 进程:

    top 命令得到占用 CPU 高的 pid:

    PID     USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    22265   test      20   0 3171m 425m  15m S  213.3  17.3  42:22.12 java
    
    ps -ef | grep tomcat | grep -v elasticsearch | grep 22265
    

    如果有值,那就是 tomcat 占用 CPU 很高,需要进一步查看原因。

  8. 查看 linux 是否出现大量的 CLOSE_WAIT
    由于目前 CSM 的 solr 和 UEBA 的 elasticsearch,程序中的做法是保持长连接,有可能会因为网络不稳定产生 CLOSE_WAIT,但是这个数量很少且不影响系统,故查询的时候需要排除。

    去除 solr(单机, 端口 8983) 的命令:

    netstat -anp | grep CLOSE_WAIT | grep -v 8983 | wc -l
    

    去除 solr(集群,端口 8080) 命令

    netstat -anp | grep CLOSE_WAIT | grep -v 8983 | wc -l
    

    去除 elasticsearch(UEBA6.0 版本端口 9200) 的命令:

    netstat -anp | grep CLOSE_WAIT | grep -v 9200 | wc -l
    

    去除 elasticsearch(UEBA7.0 版本端口 6200) 的命令:

    netstat -anp | grep CLOSE_WAIT | grep -v 6200 | wc -l
    

    如果上面命令执行后数字比较大,需要进一步寻找原因。