前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux服务器负载问题排查思路以及常用指令总结

linux服务器负载问题排查思路以及常用指令总结

作者头像
lyb-geek
发布2018-12-27 14:48:38
3K0
发布2018-12-27 14:48:38
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路

最近在维护公司线上的服务器,排查了一些问题,所以做一个总结。有一段时间,线上环境变得很卡,客户端请求很多都报超时,因为线上没有良好的apm监控,所以只能通过流量高峰期和日志去排查问题。通过排查,发现数据库的慢查询日志在比之间的暴涨了十倍,然后发现,memcache服务器(8核)负载很高,cpu一直在50%的左右,原因就是memcache服务器内存用完,导致内存的淘汰十分频繁,这样就导致很多请求落到数据库。下面说下主要的排查思路和用到的工具

服务的性能主要看的就是四大件:cpu、内存、磁盘、网络。排查过程的重要程度也是有重到轻。

一、CPU和内存问题

我一般使用的就是最常见的top命令和htop命令,因为内存和cpu这个命令都有展示了所以就一起说了,而且内存也比较直观。htop比top更简单方便,现在也在慢慢开始用htop,因为在启动一些应用的时候很多时候命令行非常长,如果实在top命令中因为字符限制,这个命令就不全,不能找到启动这个应用的命令行,就无法定位到这个进程是什么应用,htop可以左右移动,可以完整的看到,我当初也是因为这个功能才用的它。因为两个命令差不多,所以只说下top。

top命令

常用参数: -H 打印具体的线程, -p 打印某个进程 进入后 按数字1 可以切换cpu的图形看有几个核

下面是我的测试环境shell:

代码语言:javascript
复制
top - 14:28:49 up 7 min,  3 users,  load average: 0.08, 0.26, 0.19
Tasks: 221 total,   2 running, 219 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.1 us,  3.4 sy,  0.0 ni, 91.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   985856 total,    81736 free,   646360 used,   257760 buff/cache
KiB Swap:  2094076 total,  1915196 free,   178880 used.   141592 avail Mem

我一般重点关注的指标有:

%Cpu(s): 5.1 us, 3.4 sy, 0.0 wa

这里可以非常直观的看到当前cpu的负载情况,us用户cpu占用时间,sy是系统调用cpu占用时间,wa是cpu等待io的时间,前面两个比较直观,但是第三个其实也很重要,如果wa很高,那么你就该重点关注下磁盘的负载了,尤其是像mysql这种服务器。

load average: 0.08, 0.26, 0.19

cpu任务队列的负载,这个队列包括正在运行的任务和等待运行的任务,三个数字分别是1分钟、5分钟和15分钟的平均值。这个和cpu占用率一般是正相关的,反应的是用户代码,如果超过了内核数,表示系统已经过载。也就是说如果你是8核,那么这个数字小于等于8的负载都是没问题的,我看网上的建议一般这个值不要超过ncpu*2-2为好。

KiB Mem : 985856 total, 81736 free, 646360 used, 257760 buff/cache

内存占用情况,total总内存,free空余内存, used已经分配内存,buff/cache块设备和缓冲区占用的内存,因为Linux的内存分配,如果有剩余内存,他就会将内存用于cache,这样可以较少磁盘的读写提高效率,如果有应用申请内存,buff/cache这部分内存也是可用的,所以正真的剩余内存应该是free+buff/cache

swap

线上服务器一般都是禁用状态,所以不用看这项。

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

这一栏主要是看进程的详情,重点是%CPU %MEM,之前看的是整个服务器的负载,这里是每个进程的负载。

vmstat命令

这个命令和top有很多重叠,其实很多命令之间都有重叠,这个命令我主要会看下system这一栏,in线程中断,cs线程上下文切换是否有异常,还有io这一栏。对top是一个非常好的补充。

代码语言:javascript
复制
root@ubuntu:~# vmstat 2 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0 452352 195164  25648 365140   23  199   717   292  166  626  4  3 93  1  0
 0  0 452352 195156  25648 365140    0    0     0     0   97  201  0  0 100  0  0
 1  0 452352 195156  25648 365140    0    0     0     0   96  197  1  1 99  0  0

free命令

查看内存使用状态,因为top命令中已经有了,所以很少使用。

典型问题 java应用出问题一般都是内存和cpu的问题,像cpu飙高,内存不够等是通过这些来发现。一般cpu问题,通过top定位到进程号,然后输入H切换到线程,记住具体的进程号,使用jstack打印java进程的线程栈,jstack输出为十六进制,需要将top的转换成十六进制的然后入找线程经常卡在哪个方法。如果是内存问题,则通过gc日志和jmap输出dump文件。

二、磁盘问题

磁盘问题在mysql服务器中非常常见,很多时候mysql服务器的CPU不高但是却出现慢查询日志飙升,就是因为磁盘出现了瓶颈。还有mysql的备份策略,如果没有监控磁盘空间,可能出现磁盘满了服务不可用的现象。

iostat命令

常用参数: -k 用kb为单位 -d 监控磁盘 -x显示详情 num count 每个几秒刷新 显示次数

这个是我查看磁盘负载的主要工具,也可以显示cpu的负载,不过我一般用iostat -kdx 2 10,下面是我测试环境执行情况:

代码语言:javascript
复制
root@ubuntu:~# iostat -kdx 2 10
Linux 4.13.0-38-generic (ubuntu)    11/18/2018  _x86_64_    (1 CPU)
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda              24.75   196.05  121.66    9.75  2481.33   961.29    52.40     0.44    3.33    1.12   30.95   0.51   6.71
scd0              0.00     0.00    0.02    0.00     0.08     0.00     7.00     0.00    0.25    0.25    0.00   0.25   0.00

我一般重点关注的指标有:

rkB/s和wkB/s

分别对应读写速度

avgqu-sz

读写队列的平均请求长度,可以类比top命令的load average

await r_await w_await

io请求的平均时间(毫秒),分别是读写,读和写三个平均值。这个时间都包括在队列中等待的时间和实际处理读写请求的时间,还有svctm这个参数,他说的是实际处理读写请求的时间,照理来讲wawait肯定是大于svctm的,但是我在线上看到有wawait小于svctm的情况,不知道是什么原因。我看iostat的man手动中说svctm已经废弃,所以一般我看的是这三个。

%util

这个参数直观的看磁盘的负载情况,我首先看的就是这个参数。和top的wa命令有关联。

iotop命令

这个命令非常简单,主要用于直观的看那些进程占用io较高,是否有异常的进程。

代码语言:javascript
复制
Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                                                                                                    
1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init auto noprompt
2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
4 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/0:0H]
6 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [mm_percpu_wq]
7 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
8 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_sched]
9 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_bh]

du和df命令

主要是通过这两个命令看系统的磁盘占用率和文件夹的大小,有时候日志文件不清理会导致磁盘用满等情况。

du

用法: df -h 查看磁盘占用情况

df

用法: du -sh 查看当前目录 容量

典型问题 磁盘问题我在mysql服务器上处理过几次,mysql负载大时,很多时候磁盘先到了瓶颈,大量个请求超时,cpu负载却不高,如果mysql服务器异常,建议重点看下磁盘。

三、网络问题

在线上服务器,大部分服务器都是只能内网访问,放在公网的服务器也就那几台nginx和ftp的,另外公网的那些服务器都有流量监控,所以网络问题一般并不大,不再详细说明,推荐一些工具,如果有需要可以对着查下。

nload命令

用于监控整体的带宽

nethogs

用于监控进程的带宽使用情况

tcpdump

这个工具挺有意思的,可以用来做抓包,如果对网络协议有兴趣的话也可以玩玩,它可以完整的监控到三次握手的帧,有利于更好的理解tcp协议,这个命令当时玩过一段时间,功能十分强大,主要用于排查疑难杂症,需要对网络协议较深的理解。 这里有一篇不错的文章:聊聊 tcpdump 与 Wireshark 抓包分析,相应链接如下

https://www.jianshu.com/p/8d9accf1d2f1

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linyb极客之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、CPU和内存问题
    • top命令
      • vmstat命令
        • free命令
        • 二、磁盘问题
          • iostat命令
            • iotop命令
              • du和df命令
              • 三、网络问题
                • nload命令
                  • nethogs
                    • tcpdump
                    相关产品与服务
                    云服务器
                    云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档