通過下面十個命令來了解有關系統資源使用和運行情況
~~~
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主從復制
- 對于工作的認識與思考