精华内容
下载资源
问答
  • 公司的应用程序有时候会莫名其妙地挂掉,如果我们经常去登录服务器看是不是程序挂了,挂了再拉起,那样是非常耗时和麻烦的事情。后来我们通过使用 supervisor 去守护启动,实现方法如下:那什么是 supervisor了?...

    公司的应用程序有时候会莫名其妙地挂掉,如果我们经常去登录服务器看是不是程序挂了,挂了再拉起,那样是非常耗时和麻烦的事情。

    后来我们通过使用 supervisor 去守护启动,实现方法如下:

    那什么是 supervisor了?

    Supervisor是用 Python 开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便地监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,或者是意外被停止(系统负载过高,cpu占用率很高等),supervisor 监听到进程死后,会自动将它重新拉起来,很方便地做到进程自动恢复的功能,不再需要自己写shell脚本来控制。一般情况下,yum直接安装即可。yum install supervisor

    首先我们需要首先注意的一个地方是配置文件的后缀。

    vim /etc/supervisord.conf

    [include]

    files = supervisord.d/*.ini

    如果你想配置文件为其他格式,比如 conf 格式的话, 需要更改 iles = supervisord.d/*.conf 。

    比如我们需要守护启动一个进程,我们就以守护Prometheus 为例:

    vim /etc/supervisord.d/proms.ini

    [program:proms]

    command=/opt/prometheus/server/prometheus/prometheus

    directory=/opt/prometheus/server/prometheus

    stdout_logfile=/home/data/logs/prometheus/sever.log

    autostart=true

    autorestart=true

    redirect_stderr=true

    user=root

    startsecs=3

    supervisor配置文件详解:

    program: 指定的守护进程名

    command: 命令

    stdout_logfile: 日志路径

    autostart: supervisor启动的时候是否随着同时启动,默认为 true

    autorestart: 是否挂了自动重启

    redirect_stderr:标准错误重定向

    startsecs: 子进程启动多少秒之后,此时的状态是running

    启动supervisor--(yum方式安装的)

    /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf

    或者

    systemctl start supervisord.service

    因此 我们可以使用如下的命令进行进程的停止,启动,重启等操作。

    supervisorctl status # 查看应用启动状态

    supervisorctl stop proms # 停止prometheus应用

    supervisorctl start proms # 启动prometheus应用

    supervisorctl restart proms # 重启prometheus应用

    虽然使用上面的策略 supervisor, 可以实现进程的守护启动,如果进程挂了,会自动拉起,但是并没有告警通知的功能。所以我们需要监控进程的状态并实现告警 通知到对应的开发人员以及运维人员。对于这样的场景,我们如何去实现了?

    分析

    对于这种情况,我们可以使用如下的方案去实现:

    方案一:使用 Zabbix/Prometheus监控系统,对Java应用程序做 TCP 端口检测。如果检测端口不通,就设置检测失败的触发器。然后实现告警.

    方案二: 使用 Zabbix的自定义Key去实现告警,自定义key 的内容是执行一个shell脚本,Shell脚本用来检测进程是否存在,不存在的话,输出为 0,存在输出为1。然后Zabbix 的触发器 设置最近的T值 不为1,从而来实现进程状态检测的告警。

    方案三:编写Python脚本用来检测进程的状态,然后使用Python的内置库,实现邮件告警。

    解决

    思路整理

    这里我们重点讲下python如何检测。

    1.首先Python程序需要检测 Java进程是否存在。

    2.检测到进程如果存在不做任何处理,如果不存在,就需要触发邮件告警的函数

    3.Python程序需要定时定期地去执行检测脚本。

    代码实现

    第一阶

    首先我们先来实现判断进程是否存在的逻辑,判断进程是否存在,我们采用 psutil来实现。库的安装方法如下:

    pip3 install psutil

    检测进程存在的代码逻辑如下:

    #coding:utf-8

    import psutil

    def checkprocess(processname):

    pl = psutil.pids()

    for pid in pl:

    if p.utilutil.Process.pid).name() == processname:

    return pid

    if isinstance(checkprocess("notepad++.exe"),int):

    print("进程存在")

    else:

    print(:进程不存在")

    解析:

    首先我们先定义一个 checkprocess 函数,函数的第一个参数传入进程名, 其中 pl = psutil.pids() 表示把所有的进程列出来。

    接着我们for循环一下pid的列表,当找到 psutil.Process(pid).name() 的名词为传入的参数的名字的时候就返回pid值,没有就不做任何操作(可以认为返回内容为空)

    接着 isinstance 用于检测返回内容。

    那什么是 isinstance 了?

    我们可以直接看看官方文档, https://docs.python.org/3/library/functions.html ,https://docs.python.org/3/library/functions.html

    isinstance(object, classinfo)

    Return True if the object argument is an instance of the classinfo argument, or of a (direct, indirect or virtual) subclass thereof. If object is not an object of the given type, the function always returns False. If classinfo is a tuple of type objects (or recursively, other such tuples), return True if object is an instance of any of the types. If classinfo is not a type or tuple of types and such tuples, a TypeError exception is raised.

    我们翻译成中文,可以这样理解:

    1.格式

    isinstance(object,type-or-tuple-or-class) -> bool

    2.作用

    判断一个对象是某个类或子类的实例。

    3.参数介绍

    第一个参数(object)为对象,第二个参数(type)为类型名(int...)或类型名的一个列表((int,list,float)是一个列表)。其返回值为布尔型(True or flase)。

    当第二个参数是type-or-tuple时

    若第二个参数只有一个单独的类型,对象的类型与参数二的类型相同则返回True;

    若第二个参数为一个元组类型,则若对象类型与元组中类型名之一相同即返回True。

    第二阶段

    我们在第一阶段实现了检测进程的相关代码,现在我们来实现发送邮件的代码实现,代码:内容如下:

    #coding:utf-8

    import smtplib

    from email.mime.text import MIMEText

    #第三方 SMTP 服务

    mail_host = "smtp.exmail.qq.com" # SMTP服务器

    mail_user = "tech.sys@aa.cn" # 用户名

    mail_pass = "aapwd" # 密码

    sender = 'tech.sys@aa.cn' # 发件人邮箱

    #多个邮箱用逗号隔开构成列表

    receivers = ['yyy@qq.com','xxx@qq.com'] # 接收人邮箱

    定义函数。传入3个参数,第一个是接收者,第二个是主题,第三个是正文内容

    def SendMail(receivers,title,content):

    # content = '这是正文'

    # title = '这是主题' # 邮件主题

    message = MIMEText(content, 'plain', 'utf-8') # 内容, 格式, 编码

    message['From'] = "{}".format(sender)

    message['To'] = ",".join(receivers)

    message['Subject'] = title

    try:

    smtpObj = smtplib.SMTP_SSL(mail_host, 465) # 启用SSL发信, 端口一般是465

    smtpObj.login(mail_user, mail_pass) # 登录验证

    smtpObj.sendmail(sender, message['To'].split(','), message.as_string()) #邮件发"

    发" int("mail has been send successfully.")

    except smtplib.SMTPException as e:

    print(e)

    ##测试邮件发送

    SendMail(receivers,"主题","正文2")

    解析:

    上面的代码已经做了注释,代码功能不做详解。我们要注意的一点的是:smtpObj.sendmail(sender, message['To'].split(','), message.as_string())

    因为之前我们的收件人,是列表的形式,所以在发送邮件的时候,我们需要 使用, 用 收件人进行逐一发送邮件。

    第三阶段

    整合以上两段代码,既可以检测进程又可以发送邮件:

    #coding:utf-8

    import smtplib

    from email.mime.text import MIMEText

    import psutil

    #定义第三方 SMTP 服务

    mail_host = "smtp.exmail.qq.com" # SMTP服务器

    mail_user = "tech.sys@aa.cn" # 用户名

    mail_pass = "aapwd" # 密码

    sender = 'tech.sys@aa.cn' # 发件人邮箱

    receivers = ['yy@qq.com','xx@qq.com'] ## 多个邮箱用逗号隔开构成列表

    #定义进程名

    P_name = "node_exporter"

    #邮件发送函数

    def SendMail(receivers,title,content):

    # content = '这是正文'

    # title = '这是主题' # 邮件主题

    message = MIMEText(content, 'plain', 'utf-8') # 内容, 格式, 编码

    message['From'] = "{}".format(sender)

    message['To'] = ",".join(receivers)

    message['Subject'] = title

    try:

    smtpObj = smtplib.SMTP_SSL(mail_host, 465) # 启用SSL发信, 端口一般是465

    smtpObj.login(mail_user, mail_pass) # 登录验证

    smtpObj.sendmail(sender, message['To'].split(','), message.as_string()) # 发送

    print("mail has been send successfully.")

    except smtplib.SMTPException as e:

    print(e)

    #定义检测进程函数

    def checkprocess(processname):

    pl = psutil.pids()

    for pid in pl:

    if psutil.Process(pid).name() == processname:

    return pid

    #SendMail(receivers,"主题","正文2")

    if isinstance(checkprocess(P_name),int):

    pass # 进程存在

    else:

    print("{0}进程不存在,发送邮件".format(P_name))

    SendMail(receivers,"{0}进程down掉了".format(P_name),"{0}进程down掉了,请检测原因....".format(P_name))

    解析:

    上面的代码逻辑只是整合了两段代码, 并没有做其他的处理。首先是导入需要的模块,然后定义所需要的变量,以及函数,最后通过format函数将变量传入函数中而已。

    需要注意的一点是,因为收件人是列表,那么在邮件发送的时候需要把列表进行切分,也就是使用split把收件人一个个地拿出来,然后再去进行邮件发送。

    message['To'].split 切分出每个收件人(',') #split 切分出每个收件人

    我们执行一下这段函数结果如下:

    [root@me03 www]# python3 check_mail.py

    node_exporter进程不存在,发送邮件

    mail has been send successfully.

    至此我们基本上实现了可以通过检测进程然后实现告警了。但是在我们编程当中,我们需要有模块化的编程思想,也就是有一些组件如果能模块化就进行模块化,那样子如果你有其他需求的话,想复用原来脚本的函数的话就不需要再去写重复的函数了。

    所以我们可以通过类的方式进行导入。然后实现模块化的编程。

    第四阶段

    模块化编程,我们可以把邮件发送封装成一个类,用的时候直接导入即可。目录结构如下:

    [www@me03 ~]$ tree ee/

    ee/

    ├── check.py

    └── S_mail.py

    0 directories, 2 files

    [www@me03 ~]$

    S_mail.py 代码如下:

    #coding:utf-8

    import smtplib

    from email.mime.text import MIMEText

    class SendEMail(object):

    # 定义第三方 SMTP 服务

    def __init__(self):

    self.mail_host = "smtp.exmail.qq.com" # SMTP服务器

    self.mail_user = "tech.sys@aa.cn" # 用户名

    self.mail_pass = "aapwd" # 密码

    self.sender = 'tech.sys@aa.cn' # 发件人邮箱

    self.smtpObj = smtplib.SMTP_SSL(self.mail_host, 465)

    self.smtpObj.login(self.mail_user, self.mail_pass) # 登录验证

    def sendmail(self, receivers, title, content):

    message = MIMEText(content, 'plain', 'utf-8') # 内容, 格式, 编码

    message['From'] = "{}".format(self.sender)

    message['To'] = ",".join(receivers)

    message['Subject'] = title

    try:

    self.smtpObj.sendmail(self.sender, message['To'].split(','), message.as_string()) # 发送

    print("mail has been send successfully.")

    except smtplib.SMTPException as e:

    print(e)

    if name == 'main':

    sm = SendEMail()

    sm.sendmail(['1093381395@qq.com'], '主题', '正文')

    解析:

    构造函数中初始化了邮件发送人、 smtp服务器等等。mail邮件发送函数进行发送邮件。要注意sm.sendmail` 传入的收件人是列表

    我们再看看check.py 的内容。

    #coding:utf-8

    from S_mail import SendEMail #导入邮件类

    import psutil

    #实例化邮件类

    sm = SendEMail()

    #定义收件人

    receivers = ['1093381395@qq.com','xx@qq.com'] # 接收人邮箱

    #定义进程名

    P_name="node_exporter"

    #定义检测进程函数

    def checkprocess(processname):

    pl = psutil.pids()

    for pid in pl:

    if psutil.Process(pid).name() == processname:

    return pid

    if isinstance(checkprocess(P_name),int):

    pass # 进程存在

    else:

    print("{0}进程不存在,发送邮件".format(P_name))

    sm.sendmail(receivers,"{0}进程down掉了".format(P_name),"{0}进程down掉了,请检测原因....".format(P_name))

    check.py的代码就更加简单了,首先我们先是导入了邮件类,类的作用是用来发送邮件用的,然后实例化邮件类,再定义一些变量信息。比如收件人等。最后我们通过编写进程检测函数,用来检测进程,如果进程不存在则会调用邮件类里的邮件发送函数来实现告警

    第四阶段:

    我们实现了检测进程是否存在然后实现告警的代码,现在我们需要它定时去检测,然后实现告警。我们加到计划任务里去。这两个文件放到一个指定的目录 下。(一定要放到同一个目录下,不然无法导入。如果放到其他的目录的话,需要修改check.py的模块导入路径才行)

    /1 * python3 /home/data/scripts/check.py

    到此,我们通过定时执行脚本检测进程并实现告警的需求得以实现。

    展开全文
  • Java程序性能监控工具

    2018-08-07 00:48:00
    确定系统运行的整体状态,基本定位问题所在 uptime命令 [root@localhost ~]# uptime23:19:38 up 244 days, 3:39, 34 users, load average: 7.36, 7.81, 7.79 ps,获取服务器有多少逻辑核心:grep 'model name' /...


    系统性能监控:

    确定系统运行的整体状态,基本定位问题所在

    uptime命令

    [root@localhost ~]# uptime
    23:19:38 up 244 days, 3:39, 34 users, load average: 7.36, 7.81, 7.79

    ps,获取服务器有多少逻辑核心:grep 'model name' /proc/cpuinfo | wc -l,一般情况下load average除以逻辑核心数 < 0.7 认为CPU压力不大

    系统时间
    时间从开机到现在的运行时间
    连接数:每一个终端算一个连接
    1,5,15分钟内的系统平均负载:运行队列中的平均进程数。

    top命令

    第一行同uptime
    CPU、内存情况
    每个进程占CPU的情况

    可以知道哪个程序占用CPU最多

    vmstat命令

    可以统计系统的CPU,内存,swap,io等情况

    CPU占用率很高,上下文切换频繁、说明系统中有线程正在频繁切换。

    vmstat 1 4 指定采样频率和采样次数,每1秒采集1次,采集4次

    [root@localhost ~]# vmstat 1 4
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
    r b swpd free buff cache si so bi bo in cs us sy id wa st
    8 0 0 638328 31104 46136032 0 0 17 85 0 0 3 3 94 0 0
    7 0 0 636872 31112 46136076 0 0 128 1416 46076 129603 11 10 79 0 0
    7 0 0 636504 31112 46136308 0 0 0 996 45864 122568 11 10 79 0 0
    13 0 0 635540 31112 46136380 0 0 0 2972 48854 127109 11 12 77 0 0


    cs和us代表上下文切换。

    pidstat命令

    细致观察进程
    需要安装: yum install -y sysstat
    监控CPU
    监控IO
    监控内存


    pidstat -p 58 -u 1 3

    -p表示指定进程,进程id为58
    -u指定采样CPU,每1秒采样一次,采集3次

    [root@localhost ~]# pidstat -p 146603 -u 1 3
    Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 08/06/2018 _x86_64_ (32 CPU)
    11:34:26 PM UID PID %usr %system %guest %CPU CPU Command
    11:34:27 PM 992 146603 0.00 0.00 0.00 0.00 11 ssh
    11:34:28 PM 992 146603 0.00 0.00 0.00 0.00 11 ssh
    11:34:29 PM 992 146603 0.00 0.00 0.00 0.00 11 ssh
    Average: 992 146603 0.00 0.00 0.00 0.00 - ssh


    pidstat -p 58 -u 1 3 -t 
    -t参数:查看进程中线程的使用情况

    pidstat -p 58 -d 1 3 -t 
    -d 查看磁盘io的情况

    Java自带的工具

    查看java程序运行细节,进一步定位问题

    jps

    列出java进程,类似于ps命令
    -q可以指定jps只输出进程id,不输出类的短名称
    -m参数可以用于输出传递给java进程(主函数)的参数
    -l可以用于输出主函数的完整路径
    -v可以显示传递给jvm的参数

     

    支持远程监控(需要开启安全授权)

    jps 192.168.1.10

    安全授权

    在远程机器%JAVA_HOME%/bin/目录下存储jstatd.all.policy文件,内容如下:

    grant codebase "file:${java.home}/../lib/tools.jar" {
        permission java.security.AllPermission;
    };

    然后在进入jstatd.all.policy所在目录下,通过如下的命令启动RMI服务:

    ./jstatd -J-Djava.security.policy=jstatd.all.policy 

    或者

    ./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.22.249

    jstat

    jstat -gcutil 9统计gc信息:

    说明:

    图中显示,FGC一共有3次,用时547毫秒,平均一次gc占用时间为547/3=182毫秒,结合JVM运行时长来看这个full gc是否合理,比如这个数据是jvm启动了一天之后的数据,即一天3次full gc,且每次182毫秒,对于平均响应时间为1s的应用来说这完全没有问题;如果是1小时3次,应用的响应时间为几十毫秒,这个就有影响了,GC的时间消耗是否合理是相对的。

    字段说明

    S0 年轻代中第1个幸存区已使用的占当前容量百分比

    S1 年轻代中第2个幸存区已使用的占当前容量百分比

    E  年轻代中Eden已经使用的占当前容量的百分比

    O  old代中Eden已经使用的占当前容量的百分比

    P  perm代中Eden已经使用的占当前容量的百分比

    YGC  JVM启动到采样时年轻代gc次数

    YGCT JVM启动到采样时年轻代gc所用时间

    FGC JVM启动到采样时old代(full gc)gc次数

    FGCT JVM启动到采样时old代(full gc)gc所用时间

    GCT JVM启动到采样时gc用的总时间

    支持远程监控(需开启安全授权)

    jstat -gcutil 1198@192.168.1.10

    jinfo

    可以用来查看正在运行的java应用程序的扩展参数,甚至支持在运行时,修改部分参数。
    -flag <name> 打印指定JVM的参数值
    -flag [+|-] <name> 设置指定JVM参数的布尔值
    -flag <name>=<value>:设置指定JVM参数的值

    显示了新生代对象晋升到老年代对象的最大年龄:
    [root@localhost ~]# jinfo -flag MaxTenuringThreshold 2972
    输出:-XX:MaxTenuringThreshold=15

    显示是否打印GC详细信息:
    [root@localhost ~]# jinfo -flag PrintGCDetails 23415
    -XX:-PrintGCDetails (-号代表false)

    运行时修改参数,控制是否输出GC日志(不用重启进程)
    [root@localhost ~]# jinfo -flag +PrintGCDetails 23415
    [root@localhost ~]# jinfo -flag PrintGCDetails 23415
    -XX:+PrintGCDetails

    jmap 

     

    3.1、生成java应用程序的堆快照和对象的统计信息
    jmap -histo 23415 > /home/bgq/s.txt

    [root@localhost ~]# cat /home/bgq/s.txt |less

    num #instances #bytes class name
    ----------------------------------------------
    1: 195451 21772752 [C
    2: 82717 18440736 [B
    3: 18116 16245400 [I

    输出默认是占用空间大小(#bytes)倒序显示。

    [I代表整数数组


    3.2、Dump堆
    jmap -dump:format=b,file=/home/bgq/heap.hprof 23415

    dump完成之后,通过工具打开这个文件。比如mat工具

    jstack

    打印线程dump,注意一定要用该进程的启动用户去拉,否则会报 Unable to open socket file: target process not responding or HotSpot VM not loaded 错误。

    -l 打印锁信息
    -m 打印java和native的帧信息
    -F 强制dump,当jstack没有响应时使用

    打印120这个pid的线程信息
    jstack 120 >> C:\a.txt

    JStack 拉取的文件信息基本分为以下几个部分:
    该拉取快照的服务器时间
    JVM 版本
    以线程 ID(即 tid)升序依次列出当前进程中每个线程的调用栈
    死锁(如果有的话)
    阻塞锁链
    打开的锁链
    监视器解锁情况跟踪
    每个线程在等待什么资源,这个资源目前在被哪个线程 hold,尽在眼前。JStack 最好在压测时多次获取,找到的普遍存在的现象即为线程瓶颈所在。

     

     

    JConsole

    图形化监控工具
    可以查看java应用程序的运行情况,监控堆信息,永久区使用情况,类加载情况等。

    堆:新生代、老年代
    非堆:堆以外的内存,包括code cache、compressed class space

    Jvisual VM

    比jconsole更强大的工具
    多合一故障诊断和性能监控的可视化工具。

    性能监控:找到占用CPU时间最长的方法
    抽象器-->CPU

    分析堆Dump

     

    练习:
    运行一个程序ThreadBlockMain,期望输出Hello, World,结果在程序运行后,程序卡死,没有预期输出


    1、通过jps获取进程id号
    2、打印进程的线程信息:jstack 2300 > C:\ts.txt
    3、打开文件,查看,通过进程发现在等待一个socket receive


    练习2:
    java程序HoldCPUMain运行后,发现占用CPU很高,希望能找到原因。

    1、通过jps获取HoldCPUMain的进程id号
    2、uptime查看负载
    3、top命令,查看java程序CPU占用率100%
    4、pidstat -p 3455 1 3 -u -t
    打印CPU的线程输出情况,发现某个线程3467,占用CPU特别高
    3467转16进制:D8B(jstack获取的线程信息文件中,线程号以16进制呈现)
    jstack 3455 > C:\ts.txt

    然后根据jstack的线程调用信息,查看指定的代码行。

     

    练习3:
    死锁。

    如何从jstack的输出中找出死锁。

    看是不是有线程互相等待

     

    使用jvisualvm、jmc远程监控JVM

    https://blog.csdn.net/mn960mn/article/details/73958701

     

    IBM HeapAnalyzer简介使用

    https://blog.csdn.net/wwd0501/article/details/78657319

     

    转载于:https://www.cnblogs.com/byron0918/p/9434407.html

    展开全文
  • 系统性能监控:确定系统运行的整体状态,基本定位问题所在uptime命令[root@localhost ~]# uptime23:19:38 up 244 days, 3:39, 34 users, load average: 7.36, 7.81, 7.79ps,获取服务器有多少逻辑核心:grep 'model ...

    系统性能监控:

    确定系统运行的整体状态,基本定位问题所在

    uptime命令

    [root@localhost ~]# uptime

    23:19:38 up 244 days, 3:39, 34 users, load average: 7.36, 7.81, 7.79

    ps,获取服务器有多少逻辑核心:grep 'model name' /proc/cpuinfo | wc -l,一般情况下load average除以逻辑核心数 < 0.7 认为CPU压力不大

    系统时间

    时间从开机到现在的运行时间

    连接数:每一个终端算一个连接

    1,5,15分钟内的系统平均负载:运行队列中的平均进程数。

    top命令

    第一行同uptime

    CPU、内存情况

    每个进程占CPU的情况

    可以知道哪个程序占用CPU最多

    vmstat命令

    可以统计系统的CPU,内存,swap,io等情况

    CPU占用率很高,上下文切换频繁、说明系统中有线程正在频繁切换。

    vmstat 1 4 指定采样频率和采样次数,每1秒采集1次,采集4次

    [root@localhost ~]# vmstat 1 4

    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

    r b swpd free buff cache si so bi bo in cs us sy id wa st

    8 0 0 638328 31104 46136032 0 0 17 85 0 0 3 3 94 0 0

    7 0 0 636872 31112 46136076 0 0 128 1416 46076 129603 11 10 79 0 0

    7 0 0 636504 31112 46136308 0 0 0 996 45864 122568 11 10 79 0 0

    13 0 0 635540 31112 46136380 0 0 0 2972 48854 127109 11 12 77 0 0

    cs和us代表上下文切换。

    pidstat命令

    细致观察进程

    需要安装: yum install -y sysstat

    监控CPU

    监控IO

    监控内存

    pidstat -p 58 -u 1 3

    -p表示指定进程,进程id为58

    -u指定采样CPU,每1秒采样一次,采集3次

    [root@localhost ~]# pidstat -p 146603 -u 1 3

    Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 08/06/2018 _x86_64_ (32 CPU)

    11:34:26 PM UID PID %usr %system %guest %CPU CPU Command

    11:34:27 PM 992 146603 0.00 0.00 0.00 0.00 11 ssh

    11:34:28 PM 992 146603 0.00 0.00 0.00 0.00 11 ssh

    11:34:29 PM 992 146603 0.00 0.00 0.00 0.00 11 ssh

    Average: 992 146603 0.00 0.00 0.00 0.00 - ssh

    pidstat -p 58 -u 1 3 -t

    -t参数:查看进程中线程的使用情况

    pidstat -p 58 -d 1 3 -t

    -d 查看磁盘io的情况

    Java自带的工具

    查看java程序运行细节,进一步定位问题

    jps

    列出java进程,类似于ps命令

    -q可以指定jps只输出进程id,不输出类的短名称

    -m参数可以用于输出传递给java进程(主函数)的参数

    -l可以用于输出主函数的完整路径

    -v可以显示传递给jvm的参数

    支持远程监控(需要开启安全授权)

    jps 192.168.1.10

    安全授权

    在远程机器%JAVA_HOME%/bin/目录下存储jstatd.all.policy文件,内容如下:

    grant codebase "file:${java.home}/../lib/tools.jar" {

    permission java.security.AllPermission;

    };

    然后在进入jstatd.all.policy所在目录下,通过如下的命令启动RMI服务:

    ./jstatd -J-Djava.security.policy=jstatd.all.policy

    或者

    ./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.22.249

    jstat

    jstat -gcutil 9统计gc信息:

    262379e7620917c6519a577d0c001010.png

    说明:

    图中显示,FGC一共有3次,用时547毫秒,平均一次gc占用时间为547/3=182毫秒,结合JVM运行时长来看这个full gc是否合理,比如这个数据是jvm启动了一天之后的数据,即一天3次full gc,且每次182毫秒,对于平均响应时间为1s的应用来说这完全没有问题;如果是1小时3次,应用的响应时间为几十毫秒,这个就有影响了,GC的时间消耗是否合理是相对的。

    字段说明

    S0 年轻代中第1个幸存区已使用的占当前容量百分比

    S1 年轻代中第2个幸存区已使用的占当前容量百分比

    E  年轻代中Eden已经使用的占当前容量的百分比

    O  old代中Eden已经使用的占当前容量的百分比

    P  perm代中Eden已经使用的占当前容量的百分比

    YGC  JVM启动到采样时年轻代gc次数

    YGCT JVM启动到采样时年轻代gc所用时间

    FGC JVM启动到采样时old代(full gc)gc次数

    FGCT JVM启动到采样时old代(full gc)gc所用时间

    GCT JVM启动到采样时gc用的总时间

    支持远程监控(需开启安全授权)

    jstat -gcutil 1198@192.168.1.10

    jinfo

    可以用来查看正在运行的java应用程序的扩展参数,甚至支持在运行时,修改部分参数。

    -flag 打印指定JVM的参数值

    -flag [+|-] 设置指定JVM参数的布尔值

    -flag =:设置指定JVM参数的值

    显示了新生代对象晋升到老年代对象的最大年龄:

    [root@localhost ~]# jinfo -flag MaxTenuringThreshold 2972

    输出:-XX:MaxTenuringThreshold=15

    显示是否打印GC详细信息:

    [root@localhost ~]# jinfo -flag PrintGCDetails 23415

    -XX:-PrintGCDetails (-号代表false)

    运行时修改参数,控制是否输出GC日志(不用重启进程)

    [root@localhost ~]# jinfo -flag +PrintGCDetails 23415

    [root@localhost ~]# jinfo -flag PrintGCDetails 23415

    -XX:+PrintGCDetails

    jmap

    3.1、生成java应用程序的堆快照和对象的统计信息

    jmap -histo 23415 > /home/bgq/s.txt

    [root@localhost ~]# cat /home/bgq/s.txt |less

    num #instances #bytes class name

    ----------------------------------------------

    1: 195451 21772752 [C

    2: 82717 18440736 [B

    3: 18116 16245400 [I

    输出默认是占用空间大小(#bytes)倒序显示。

    [I代表整数数组

    3.2、Dump堆

    jmap -dump:format=b,file=/home/bgq/heap.hprof 23415

    dump完成之后,通过工具打开这个文件。比如mat工具

    jstack

    打印线程dump,注意一定要用该进程的启动用户去拉,否则会报 Unable to open socket file: target process not responding or HotSpot VM not loaded 错误。

    -l 打印锁信息

    -m 打印java和native的帧信息

    -F 强制dump,当jstack没有响应时使用

    打印120这个pid的线程信息

    jstack 120 >> C:\a.txt

    JStack 拉取的文件信息基本分为以下几个部分:

    该拉取快照的服务器时间

    JVM 版本

    以线程 ID(即 tid)升序依次列出当前进程中每个线程的调用栈

    死锁(如果有的话)

    阻塞锁链

    打开的锁链

    监视器解锁情况跟踪

    每个线程在等待什么资源,这个资源目前在被哪个线程 hold,尽在眼前。JStack 最好在压测时多次获取,找到的普遍存在的现象即为线程瓶颈所在。

    JConsole

    图形化监控工具

    可以查看java应用程序的运行情况,监控堆信息,永久区使用情况,类加载情况等。

    堆:新生代、老年代

    非堆:堆以外的内存,包括code cache、compressed class space

    Jvisual VM

    比jconsole更强大的工具

    多合一故障诊断和性能监控的可视化工具。

    性能监控:找到占用CPU时间最长的方法

    抽象器-->CPU

    分析堆Dump

    练习:

    运行一个程序ThreadBlockMain,期望输出Hello, World,结果在程序运行后,程序卡死,没有预期输出

    1、通过jps获取进程id号

    2、打印进程的线程信息:jstack 2300 > C:\ts.txt

    3、打开文件,查看,通过进程发现在等待一个socket receive

    练习2:

    java程序HoldCPUMain运行后,发现占用CPU很高,希望能找到原因。

    1、通过jps获取HoldCPUMain的进程id号

    2、uptime查看负载

    3、top命令,查看java程序CPU占用率100%

    4、pidstat -p 3455 1 3 -u -t

    打印CPU的线程输出情况,发现某个线程3467,占用CPU特别高

    3467转16进制:D8B(jstack获取的线程信息文件中,线程号以16进制呈现)

    jstack 3455 > C:\ts.txt

    然后根据jstack的线程调用信息,查看指定的代码行。

    练习3:

    死锁。

    如何从jstack的输出中找出死锁。

    看是不是有线程互相等待

    使用jvisualvm、jmc远程监控JVM

    https://blog.csdn.net/mn960mn/article/details/73958701

    IBM HeapAnalyzer简介使用

    https://blog.csdn.net/wwd0501/article/details/78657319

    展开全文
  • 查看实时日志文件变动大家第一反应应该是'tail -f /path/to/log'命令吧,但是如果每个网站的访问日志都是使用这种方式查看也是相当崩溃的,今天小编就跟大家分享一个强大的Nginx日志监控工具。ngxtop是一个基于...

    Linux运维工程师的首要职责就是保证业务7 x 24小时稳定的运行,监控Web服务器对于查看网站上发生的情况至关重要。关注最多的便是日志变动,查看实时日志文件变动大家第一反应应该是'tail -f /path/to/log'命令吧,但是如果每个网站的访问日志都是使用这种方式查看也是相当崩溃的,今天小编就跟大家分享一个强大的Nginx日志监控工具。

    c0ecf3c9af9b139805cfec2d7bed12ab.png

    ngxtop是一个基于python的程序,可以在Python上安装。ngxtop通过实时解析nginx访问日志,并将结果(nginx服务器的有用指标)输出到终端。

    e2e2092310690e46bb5d4d68e8c9ee3b.png

    主要的功能

    • 当前有效请求
    • 总请求计数摘要
    • 按状态代码提供的总请求数(2xx,3xx,4xx,5xx)
    • 发送平均字节
    • 顶级远程地址

    不仅能实时监控Nginx日志的访问还可以对以前的日志进行排查整理。

    在Linux上安装ngxtop

    以下操作是在CentOS 7-64bit上测试

    首先,你需要安装PIP(Python包管理系统)

    • 使用root凭据登录你的服务器
    • 通过安装以下包启用EPEL存储库
    wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-6.noarch.rpmrpm -ivh epel-release-7-6.noarch.rpm

    然后执行以下命令安装pip

    yum install python-pip

    最后使用下面安装ngxtop

    pip install ngxtop

    ngxtop使用详解

    用法:

     ngxtop [选项] ngxtop [选项](print | top | avg | sum) ngxtop info

    选项:

    3075c69676d598f6a3e53193e57bd12e.png

    ngxtop实践

    1.使用ngxtop命令查看请求计数摘要,请求的URI,状态码请求的数量。

    $ ngxtop
    5db709fb3a4a523c2986d00b38aac0c1.png

    2.检查顶级客户端的IP

    查看谁向你的Nginx服务器发出大量请求。

    ngxtop top remote_addr

    3.仅显示出404的HTTP请求

    ngxtop -i'status> = 404'
    829971936bcb3b498cda9789cd4a37d2.png

    4.分析access.log

    ngxtop -l /path/access.log

    5.解析Apache的offline access.log

    ngxtop -f common -l /path/access.log

    另外你可以可以使用多种组合来过滤access.log以获取有用的数据

    Github地址:https://github.com/lebinh/ngxtop

    92ef1e15b0affe94b1900e574aca6c64.png
    展开全文
  • 最近使用nginx流媒体服务器进行视频转码拉推流时出现内存溢出的问题,用jdk自带的jvisualvm工具看了下本地环境也没啥问题,会定期释放内存,于是想看下程序服务器运行时的内存使用情况。 具体操作如下: 1.在...
  • 进程监控程序

    2016-10-24 15:43:16
    非常方便系统运维的一个小工具服务器应用程序进程监控,有界面配置,可以自动启动监控的应用进程,确保在无人值守的应用服务器上应用的安全运行。另外,也可以监控日志文件,确保应用进程僵死状态能够被监控,并...
  • 进程监控程序32位

    2016-10-24 15:44:45
    非常方便系统运维的一个小工具32位,服务器应用程序进程监控,有界面配置,可以自动启动监控的应用进程,确保在无人值守的应用服务器上应用的安全运行。另外,也可以监控日志文件,确保应用进程僵死状态能够被监控,...
  • 只要安装了本软件你可以时时监控服务器的系统资源运行状态,网络状态,发现服务器运行超载本软件就会给您发送警告信息,当发现网络内出现网络丢包现象本软件就会给您发送警告信息!本软件是一个网络公司排除网络内...
  • 服务器监控Munin的配置

    千次阅读 2008-12-19 11:33:00
    作为开发人员,我觉得有必要了解服务器运行状态,特别是那些部署了自己写的程序服务器。当面对出现的问题,能立刻获取服务器各项指标状态的第一手资料,对问题的彻底解决会有很大的帮助。dbanotes冯大辉说“笔者...
  • 当然,要使用这些工具,你必须在服务器跟前进行操作,而且这些 GUI 的程序占用了很多系统资源,所以说,尽管 GUI 用来做基本的服务器健康状态监测挺好,但如果你想知道真正发生什么,请关掉 GUI 开始命令行之旅吧。...
  • MyProcess进程管理器是一个专门用于实时检测程序运行状态的小软件. 一般用于服务器监控服务端程序,以免因服务端程序因意外退出,导致 客户端软件无法使用。
  • 引言系统日志是应用程序问题诊断及运行维护的重要工具。Logback、Log4j 是常用于 Java 平台的日志记录 API. 目前大部分产品只是将系统重要参数、状态的变化及异常信息通过日志输出。本文将要介绍的 Perf4j 是一款...
  • 背景:在windows系统中为定期完成某项任务,可以在系统管理工具的Task Scheduler中创建Task,设置执行账号和触发时间(如定期重启服务器)。现收到用户需求,监控用户在Task Scheduler中创建任务的执行状态(多个...
  • SQL Server监控清单

    2013-07-24 15:20:19
    服务器状态监控,不管使用第三方工具,还是使用自定义脚本,都建议部署在专门的一台/多台监控机上,因为如果服务器DOWN了或者故障了,任何本机的程序/脚本可能就无法运行了,从而也失去了监控的意义。 甚至有人想过...
  • 0. SQL Server监控清单

    2013-07-24 21:21:58
    磁盘可用空间 服务器状态监控,不管使用第三方工具,还是使用自定义脚本,都建议部署在专门的一台/多台监控机上,因为如果服务器DOWN了或者故障了,任何本机的程序/脚本可能就无法运行了,从而也失去了监控的意义。...
  • zabbix监控注意事项

    2020-08-17 11:05:41
    zabbix并非监控,而是实现监控工具 Zabbix-server是一个c/s和b/s结构 安装zabbbix的服务器安装时和php7.1有冲突:若此机器上已经安装php7.1就安装不上zabbix 3.监控知识体系 为什么要使用监控: 1.对系统不...
  • 1. 采集多样化的必要性,通俗的说就是把软硬件的指标放在一起去比较。...比如,我们用openTSDB去监控我的一个web程序,而用ganglia去监控了它所在的服务器,其实我们很多时候更加关注软硬件指标在同一时刻时...
  • 1、监控(Monitoring):Redis Sentinel实时监控主服务器和从服务器运行状态; 2、提醒(Notification):当被监控的某个Redis服务器出现问题时,Redis Sentinal可以向系统管理员发送通知,也可以通过API向其他程序...
  •  Spark的REST API返回的信息是JSON格式的,开发者们可以很方便地通过这个API来创建可视化的Spark监控工具。目前  这个API支持正在运行的应用程序,也支持历史服务器。在请求URL都有/api/v1。比如,对于历史服务器...
  • mysql常见监控软件:iis7服务器监控工具可以直接监控503错误监控,所以当503错误出现的时候可以直接发现: 那我们应该监控MySQL的那些状态呢?1、MySQL服务运行状态约定所有MySQL服务都必须以ip1(内网ip)来绑定,每...
  •  uptime 查看某台服务器运行了多久  htop 更加先进的交互式监控工具(需要安装)  iotop 监控并实时显示磁盘IO输入和输出和程序进程(需要安装)  iftop 网络带宽监控(需要安装) 操作系统命令:  reboot...
  • SmartFoxServer 2X管理工具

    千次阅读 2017-03-27 14:02:07
    强大的运行监控工具,可以检查实时服务器上的区域,房间和用户,拥有先进的房间和用户过滤功能,统计数据等; 完整的运行时数据,一览显示实时服务器状态,让管理员严格控制服务器性能; 高级控制台进行深度流量分析...
  • Paramon机群应用性能监控软件,通过实时监控机群管理/登录节点、计算节点、IO节点等服务器的处理器、内存、网络和存储性能数据,提供机群系统中应用软件随时间变化的运行特征  HPC机群用户在采购新系统时需要专业的...
  • elk日志工具

    2020-04-14 23:54:19
    1、分析日志来判断系统运行状态是否正常 2、分析日志来判断程序是否有bug存在 3、分析日志来监控web服务器的流量,页面的响应时间超过1s 4、分析日志来优化数据库的慢查询语句 2、日志收集的工具有那些 1、日志...
  • pm2(process manager)是一个进程管理工具,维护一个进程列表,可以用它来管理你的node进程,负责所有正在运行的进程,并查看node进程的状态,也支持性能监控,负载均衡等功能。 1.1、使用pm2管理的node程序的好处 ...
  • 在我们的工作中,我们使用ddagent ver。5作为收集工具,收集和报告托管服务器的性能指标,并对ddagent进行一定程度的定制。经过多次功能迭代,...有很多工具可以分析和导出Python程序的内存状态。在这里,我们使用py

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 313
精华内容 125
关键字:

服务器运行程序状态监控工具