Subtotal para solução de problemas de alta carga de CPU em ambiente JAVA

Subtotal para solução de problemas de alta carga de CPU em ambiente JAVA

Zhaoyang 360 Cloud Computing
Subtotal para solução de problemas de alta carga de CPU em ambiente JAVA

Declaração de heroína

Atualmente, a maioria dos ambientes web de empresas de Internet ainda é baseada em LNMP, e o PHP é mais frequentemente usado como a primeira escolha para o desenvolvimento de servidores web. Como um engenheiro de operação e manutenção para solucionar problemas de PHP, acredito que todos estão à vontade, mas em face do ambiente "muito frio" de JAVA, acredito que muitos alunos ainda parecerão desamparados. Hoje vou compartilhar com vocês um truque simples para solucionar problemas em ambiente JAVA.
PS: Rica tecnologia de primeira linha e formas diversificadas de expressão estão todas na "conversa sobre tecnologia de primeira linha HULK", preste atenção!

Introdução aos antecedentes

Atualmente, o desenvolvimento web das empresas de Internet utiliza basicamente PHP. O PHP ainda tem vantagens únicas no campo da web. É fácil de usar e tem muitos fãs. Já ocupou metade do campo da web. E JAVA é mais frequentemente usado como a primeira escolha nas áreas de telecomunicações e finanças.

Porém, como pessoal de operação e manutenção, devido às diferentes indústrias, os campos técnicos de enfoque também são diferentes. Afinal, a maioria dos alunos ainda trabalha em empresas de Internet "chefiadas por php". Ao solucionar problemas no ambiente JAVA, muitos alunos são inexperiente. Portanto, parece um pouco "atordoado". Acredito que depois de ler este artigo, todos podem dizer adeus ao "eu ignorante" para sempre.

1

Cenas

O servidor WEB de uma determinada empresa está em um ambiente JAVA e um grande número de alarmes CPU_idle foi recebido em um dia. Após fazer login no servidor, foi descoberto que o processo JAVA ocupa uma CPU alta e o problema é intermitente .

A situação específica é a seguinte:
Subtotal para solução de problemas de alta carga de CPU em ambiente JAVA
Você pode ver que o uso da CPU do host está próximo da carga total.

2

analise de problemas

De acordo com a localização do problema: o alto uso da CPU é um processo JAVA, que pertence ao serviço tomcat. Geralmente, os problemas com o tomcat são problemas de memória, como GC cheio. Se o uso da CPU for muito alto, pode ser localizado aproximadamente como um problema na camada de código, resultando em uso excessivo da CPU.

3

Use jstack para localizar o problema

introdução de jstack:


jstack是一个堆栈跟踪工具,主要用于打印指定Java进程、核心文件或远程调试服务器的Java线程的堆栈跟踪信息。

用法:
jstack [ option ] <pid>                                                      //指定进程号(pid)的进程#指定核心文件
jstack [ option ] <executable <core>                                //指定核心文件
jstack [ option ] [server-id@]<remote-hostname-or-IP>   //指定远程调试服务器

常用参数:
pid: java应用程序的进程号,一般可以通过jps来获得;
executable:产生core dump的java可执行程序;
core:打印出的core文件;
remote-hostname-or-ip:远程debug服务器的名称或IP;
server-id: 唯一id,假如一台主机上多个远程debug服务; 

基本参数: 
-l     //长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表
-F    //当’jstack [-l] pid’没有相应的时候强制打印栈信息
-m    //打印java和native c/c++框架的所有栈信息
pid   //需要被打印配置信息的java进程id,可以用jps查询

método

Use o comando para visualizar o id do thread que ocupa uma CPU muito alta. Na figura, o id do processo principal é 10832 e o id do thread com problema é 11358.

Subtotal para solução de problemas de alta carga de CPU em ambiente JAVA


细节:
1.也可以使用ps -mp $PID -o THREAD,tid,time | sort -k 2 -r | head -20来查看线程运行情况。

2.jstack内部的进程号是16进制的,所以要将线程id转换成16进制
    $ echo "obase=16;11358" | bc
    $ 2C5E

Jstack pegou o log, jstack -l 10832, e foi considerado que a correspondência da expressão regular fazia com que a CPU ficasse muito alta.
Conforme mostrado na figura:
Subtotal para solução de problemas de alta carga de CPU em ambiente JAVA

Expandir

Jstat

Este é um comando mais prático, você pode observar informações relacionadas ao carregador de classe, ao compilador e ao gc. Você pode monitorar recursos e desempenho de tempos em tempos.

Formato de comando


-class                    //统计class loader行为信息
-compile                //统计编译行为信息
-gc                         //统计jdk gc时heap信息
-gccapacity            //统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况
-gccause                //统计gc的情况,(同-gcutil)和引起gc的事件
-gcnew                   //统计gc时,新生代的情况
-gcnewcapacity      //统计gc时,新生代heap容量
-gcold                      //统计gc时,老年区的情况
-gcoldcapacity        //统计gc时,老年区heap容量
-gcpermcapacity     //统计gc时,permanent区heap容量
-gcutil                      //统计gc时,heap情况

Jmap
得到运行java程序的内存分配的详细情况。例如实例个数,大小等。

命名行格式
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP

-dump:[live,]format=b,file=<filename>     //使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
-finalizerinfo              //打印正等候回收的对象的信息.
-heap                        //打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live]                //打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
-permstat                 //打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
-F                             //强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
-h | -help                  //打印辅助信息
-J                             //传递参数给jmap启动的jvm.

Acho que você gosta

Origin blog.51cto.com/15127564/2668208
Recomendado
Clasificación