通过下面十个命令来了解有关系统资源使用和运行情况
~~~
uptimed
mesg | tail
vmstat 1
mpstat -P
ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n
DEV 1
sar -n TCP,ETCP 1
top
~~~
## 1\. uptime
~~~
$ uptime 23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02
~~~
load average除以CPU核心数得到每个CPU的平均活跃进程数,数值越大表示每个CPU上运行的进程越多,系统压力越大,当平均值大于0.7时表示系统较为繁忙。
## 2\. dmesg | tail
展示最近10条系统消息。在这些系统消息中查找最有可能引起性能问题的原因。
## 3\. vmstat 1
~~~
root@vultr:~# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 3 0 9364 1576 103296 0 0 7265 165 13 15 3 6 90 1 0
0 3 0 6220 1644 105512 0 0 17283 108 694 1398 2 5 0 93 0
~~~
`free`:空闲的内存(单位的KB)。如果计数很大,说明服务器有足够的内存,`free -m`命令将对空闲内存的状态有更好的说明。
`si`、`so`:交换置入和交换置出。如果这两个值是非空,说明物理内存用完了,现在在使用交换内存了。
如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。如果pi,po 长期不等于0,表示内存不足。如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。
## 4\. mpstat -P ALL 1
~~~
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 1.21 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 98.38
Average: 0 1.21 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 98.38
~~~
%usr在 internal 时间段里,用户态的 CPU 时间(%),不包含 nice 值为负进程。
%sys在 internal 时间段里,核心时间(%)。
%nice在 internal 时间段里,nice 值为负进程的 CPU 时间(%)。
%iowait在 internal 时间段里,硬盘 IO 等待时间(%)。
%irq在 internal 时间段里,硬中断时间(%)。
%soft在 internal 时间段里,软中断时间(%)。
可用于检查不平衡的情况。单个热CPU说明是单线程应用程序在大量占用CPU时间。
## 5\. pidstat 1
~~~
07:23:44 AM UID PID %usr %system %guest %wait %CPU CPU Command
07:23:45 AM 0 21757 1.01 0.00 0.00 0.00 1.01 0 sshd
07:23:45 AM 0 23597 0.00 1.01 0.00 1.01 1.01 0 pidstat
07:23:45 AM 0 23598 0.00 1.01 0.00 1.01 1.01 0 etcd
07:23:45 AM UID PID %usr %system %guest %wait %CPU CPU Command
07:23:46 AM 0 851 0.99 0.00 0.00 0.00 0.99 0 python
07:23:46 AM 0 23597 0.99 0.00 0.00 0.00 0.99 0 pidstat
07:23:46 AM UID PID %usr %system %guest %wait %CPU CPU Command
07:23:47 AM 0 23598 1.02 0.00 0.00 0.00 1.02 0 etcd
~~~
常用的参数:
* `-u`默认参数,显示各个进程的 CPU 统计信息
* `-r`显示各个进程的内存使用情况
* `-d`显示各个进程的 IO 使用
* `-w`显示各个进程的上下文切换
* `-p PID`指定 PID
%cpu即可查看每个进程cpu占用情况。
## 6\. iostat -xz 1
~~~
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 38.00 133.00 860.00 1412.00 0.00 2.00 0.00 1.48 0.63 0.15 0.03 22.63 10.62 0.05 0.80
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 0.00 0.00 100.00
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 131.25 2.08 920.83 4.17 0.00 0.00 0.00 0.00 0.10 0.00 0.00 7.02 2.00 0.00 0.00
~~~
这是了解块设备(磁盘),应用的工作负载和产生的性能影响的绝佳工具。重点关注下面的指标:
* `r/s`、`w/s`、`rkB/s`、`wkB/s`:这些是设备每秒交付的读取、写入、读取千字节和写入千字节。使用这些来表征块设备的工作负载。性能问题可能是由于向块设备施加了过多的工作负载。
* `await`:IO的平均时间,以毫秒为单位。这是应用程序所感受到的时间,它包括IO排队时间和IO服务时间。大于预期的平均时间可能表示块设备饱和或设备出现问题了。
* `avgqu-sz`:发给设备的平均请求数。值大于1可以表明已达到饱和状态(尽管设备通常可以并行处理请求,尤其是在多个后端磁盘所组成的前端虚拟设备的情况下)。
* `%util`:设备利用率。这是一个表征繁忙度的百分比,它表示设备每秒工作的时间。尽管它的值取决于设备,但值大于60%通常会导致性能不佳(也会通过await的值观察到)。接近100%的值通常表示饱和。
\*如果存储设备是有许多后端磁盘组成的前端逻辑磁盘设备,则100%的利用率可能仅意味着100%的时间正在处理某些IO,但是后端磁盘可能远远没有饱和,并且可能还可以处理更多的工作。
请记住,性能不佳的磁盘IO不一定是应用问题,通常可以使用许多技术以执行异步IO,以便使应用程序不会被阻塞住而产生直接产生IO延迟(例如,预读和缓冲写入技术)
## 7\. free -m
root@vultr:~# free -m
total used free shared buff/cache available
Mem: 481 331 18 0 131 137
Swap: 0 0 0
右边两列:
* `buffers`:缓冲区高速缓存,用于块设备I / O
* `cached`:页面缓存,由文件系统使用
我们只需要检查下它们的大小是否接近零。如果接近零的话,这可能导致较高的磁盘IO(可以使用iostat进行确认)和较差的性能。上面的示例看起来不错,每列都有较大的数据。
`-/+ buffers/cache`为已用和空闲内存提供较少让人产生混乱的值。Linux将可用内存用于高速缓存,但是如果应用程序需要,它们可以快速被回收。因此应以某种方式将缓存的内存包括在`free`列中,这也就是这一行的所做的。甚至还有一个[网站](http://www.linuxatemyram.com/)专门讨论了这种混乱。
如果在Linux上使用ZFS,就像我们对某些服务所做的那么,因为ZFS具有自己的文件系统缓存,它们并不会反映在`free -m`的列中,因此这种场景下这种混乱还将存在。所以会看到似乎系统的可用内存不足,而实际上可根据需要从ZFS缓存中申请到内存。
## 8\. sar -n DEV 1
~~~
07:48:28 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
07:48:29 AM ens3 3.06 10.20 0.32 1.52 0.00 0.00 0.00 0.00
07:48:29 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:48:29 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:48:29 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
07:48:30 AM ens3 5.94 16.83 0.39 2.26 0.00 0.00 0.00 0.00
07:48:30 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:48:30 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
~~~
此工具可以检查网络接口的吞吐量:`rxkB/s`和`txkB/s`,作为工作负载的度量,还可以检查是否已达到网络接口的限制。在上面的示例中,eth0接收速率达到22MB/s,即176Mbit/s(远低于1Gbit/s的网络接口限制,假设是千兆网卡)。
## 9\. sar -n TCP,ETCP 1
~~~
07:50:27 AM active/s passive/s iseg/s oseg/s
07:50:28 AM 4.08 1.02 9.18 14.29
07:50:27 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
07:50:28 AM 0.00 0.00 1.02 0.00 0.00
Average: active/s passive/s iseg/s oseg/s
Average: 3.52 1.01 14.32 18.09
Average: atmptf/s estres/s retrans/s isegerr/s orsts/s
Average: 0.00 0.00 2.51 0.00 0.50
~~~
这是一些关键的TCP指标的摘要,包括:
* `active / s`:每秒本地启动的TCP连接数(例如,通过connect())。
* `passive/s`:每秒远程启动的TCP连接数(例如,通过accept())。
* `retrans / s`:每秒TCP重传的次数。
主动和被动计数通常作为服务器TCP负载的粗略度量:新接受的连接数(被动)和新出站的连接数(主动)。将主动视为出站,将被动视为入站可能对理解这两个指标有些帮助,但这并不是严格意义上的(例如,考虑从localhost到localhost的连接)。
重新传输是网络或服务器问题的迹象;它可能是不可靠的网络(例如,公共Internet),也可能是由于服务器过载并丢弃了数据包。上面的示例仅显示每秒一个新的TCP连接。
## 10\. perf
- 文章翻译
- Large-scale cluster management at Google with Borg
- Borg Omega and kubernetes
- scaling kubernetes to 7500 nodes
- bpf 的过去,未来与现在
- Demystifying Istio Circuit Breaking
- 知识图谱
- skill level up graph
- 一、运维常用技能
- 1.0 Vim (编辑器)
- 1.1 Nginx & Tengine(Web服务)
- 基础
- 1.2 zabbix
- 定义
- 登录和配置用户
- 1.3 RabbitMQ(消息队列)
- 原理
- RabbitMQ(安装)
- 1.4虚拟化技术
- KVM
- 1.5 Tomcat(Web中间件)
- 1.6Jenkins
- pipline
- 1.7 Docker
- network
- 1.8 Keepalived(负载均衡高可用)
- 1.9 Memcache(分布式缓存)
- 1.10 Zookeeper(分布式协调系统)
- 1.11 GitLab(版本控制)
- 1.12 Jenkins(运维自动化)
- 1.13 WAF(Web防火墙)
- 1.14 HAproxy负载均衡
- 1.15 NFS(文件传输)
- 1.16 Vim(编辑器)
- 1.17 Cobbler(自动化部署)
- 二、常用数据库
- 2.1 MySQL(关系型数据库)
- mysql主从复制
- 2.2 Mongodb(数据分析)
- 2.3 Redis(非关系数据库)
- 三、自动化运维工具
- 3.1 Cobbler(系统自动化部署)
- 3.2 Ansible(自动化部署)
- 3.3 Puppet(自动化部署)
- 3.4 SaltStack(自动化运维)
- 四、存储
- 4.1 GFS(文件型存储)
- 4.2 Ceph(后端存储)
- 五、运维监控工具
- 5.1 云镜
- 5.2 ELK
- 六、运维云平台
- 6.1 Kubernetes
- 6.2 OpenStack
- 介绍
- 安装
- 七、Devops运维
- 7.1 理念
- 7.2 Devops运维实战
- 八、编程语言
- 8.1 Shell
- 书籍《Wicked Cool Shell Scripts》
- 8.2 Python
- 8.3 C
- 8.4 Java
- leecode算法与数据结构
- 九、杂记
- 高优先级技能
- 知识点
- JD搜集
- 明显的短板
- 1.0 Python
- 1.1 Kubernetes
- 1.18.2 《kubernetes in action》
- 遗漏知识点
- 1.18.3 GCP、azure、aliyun
- Azure文档
- 1.18.5 《program with kubernetes》
- Istio
- HELM
- 《Kubernetes best practice》
- Kubernetes源码学习
- Scheduler源码
- 调度器入口
- 调度器框架
- Node筛选算法
- Node优先级算法
- pod抢占调度
- 入口
- 主要代码结构
- new
- 文章翻译
- Flannel
- 从二进制集群搭建
- 信息收集
- docker优化
- 1.2 shell
- 面试题
- grep awk sed 常见用法
- shell实践
- 1.3 Data structure(数据结构)
- Calico
- Aliyun文档以及重点模块
- git
- 大数据组件
- 前端,后端,web框架
- cgroup,namespace
- 内核
- Linux搜集
- crontab
- centos7常用优化配置
- centos Mariadb
- eBPF
- ebpf的前世今生
- Linux性能问题排查与分析
- 性能分析搜集
- 性能分析常用10条
- 网络性能优化
- 文本处理命令
- sql
- Iptables
- python面试题
- iptables
- iptables详细
- zabbix面试题,proj
- prometheus
- web中间件
- nginx
- Haproxy
- grep sed awk
- Linux常用命令
- 云平台
- 书籍Linux应用技巧
- kafka
- kafka面试题
- ETCD
- Jenkins
- 3天补充的点
- K8s源码
- K8s
- k8s实操
- etcd
- test
- BPF
- PSFTP使用
- StackOverflow问答精选
- 问题
- 我对于学习思考
- 修改ssh超时时间
- 课程目录
- 运维与运维开发
- The Person
- 个人杂谈
- mysql主从复制
- 对于工作的认识与思考