日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

自開始負責生產環境部署,中間遇到了若干線上環境內存以及CPU的問題。由于微服務以及容器的流行,現在已經可以很方便的使用 K8s + prometheus + grafana + alert 的方式進行監控,這足以覆蓋大部分場景。

最重要的事情已經交由最適合的組件去做,然而了解一些在裸機上的命令以及指標也是必不可少的:

  1. 了解監控什么指標
  2. 平時寫一些腳本也經常會 OOM 或者 CPU 使用率過高

先以一張來自 linuxperf 的圖作為大綱于,我試著對一些指標進行整理,以備不時之需。

有用的一篇筆記,linux 調優各項監控指標

 

htop/top

有用的一篇筆記,linux 調優各項監控指標

 

htop 足以覆蓋大多數指標,詳細直接查看幫助即可。

  1. sort: by mem/cpu/state. 根據進程狀態排序也至關重要,特別在 load average 過高的時候。根據內存以及CPU使用率排序用以定位高資源占用者。
  2. filter
  3. fields
  4. process/ count
  5. ...

CPU 基本信息

在 linux 中一切皆文件,查看 /proc/cpuinfo 查看信息。另有衍生問題

  • 如何查看 CPU 個數
  • 如何查看 CPU model
  • 如何查看 CPU 主頻
cat /proc/cpuinfo
cat /proc/stat

平均負載 (load average)

使用 uptime 和 w 可打印出系統過去 1, 5, 15 分鐘內的平均負載。同時,你可以使用 sar -q 查看動態的平均負載。

$ uptime
 19:28:49 up 290 days, 20:25,  1 user,  load average: 2.39, 2.64, 1.55
$ w
 19:29:50 up 290 days, 20:26,  1 user,  load average: 2.58, 2.63, 1.61
USER     TTY      FROM          LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    172.16.0.1    19:27    6.00s  0.05s  0.00s tmux a

在 uptime 的 man 手冊中這么解釋平均負載

System load averages is the average number of processes that are either in a runnable or uninterruptable state.

翻譯過來就是指系統中處于可運行狀態和不可中斷狀態的平均進程數。

對于 4 核的 CPU,如果平均負載高于 4 就代表負載過高

動態平均負載

$ sar -q 1 100
Linux 3.10.0-957.21.3.el7.x86_64 (shanyue)      10/21/19        _x86_64_        (2 CPU)

16:55:52      runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
16:55:53            0       464      0.07      0.11      0.13         0
16:55:54            0       464      0.06      0.10      0.13         0
16:55:55            0       464      0.06      0.10      0.13         0
16:55:56            0       464      0.06      0.10      0.13         0
16:55:57            0       464      0.06      0.10      0.13         0
16:55:57            0       464      0.06      0.10      0.13         0
Average:            0       464      0.06      0.10      0.13         0

CPU 使用率

可以直接使用 htop/top 命令查看 CPU 使用率,idle 的cpu時間也可以直接通過 top 顯示出來

CPU 利用率 = 1 - cpu-idle-time / cpu-time

$ top
%Cpu(s):  7.4 us,  2.3 sy,  0.0 ni, 90.1 id,  0.0 wa,  0.0 hi,  0.2 si,  0.0 st
  • user: 用戶態,但不包括 nice
  • system: 內核態
  • nice: 低優先級用戶態,nice 值為 1-19 的 CPU 時間
  • idle (id)
  • iowait (wa)
  • irq (hi)
  • softirq (si)
  • steal (st)

系統調用

strace 查看系統調用

  • -p 指定pid
  • -c 統計各項系統調用被調用了多少次以及CPU時間
# 用來看一個進程所用到的系統調用
# -p: 指定 7477 號進程
$ strace -p 7477

# 用來查看某命令需要用到的系統調用
$ strace cat index.js

# 關于系統調用的統計信息
$ strace -p 7477 -c

內存

free 用以查看系統內存。

如果查看進程內存,使用 pidstat -r 或者 htop

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           3.7G        682M        398M        2.1M        2.6G        2.7G
Swap:            0B          0B          0B

進程

衍生問題

  • 如何根據命令名找到進程
  • 如何根據參數名找到進程
  • 進程狀態有哪些
  • 如何獲取進程狀態
  • 如何獲取進程的CPU占用率
  • 如何獲取進程的內存占用
# 查看 122 PID 進程
$ ps 122

# 根據命令名(command)找到 PID
$ pgrep -a node
26464 node /code/node_modules/.bin/ts-node index.ts
30549 node server.js

# 根據命令名以及參數找到 PID
$ pgrep -af ts-node
26464 node /code/node_modules/.bin/ts-node index.ts

# 查看 122 PID 進程的信息
$ cat /proc/122/status
$ cat /proc/122/*

# 打印父進程樹
# -s --show-parents: 顯示父進程
# -a --arguments: 顯示參數,如 echo hello 中 hello 為參數
$ pstree 122 -sap

procfs

man7.org/linux/man-p…

進程的狀態

  • D uninterruptible sleep (usually IO)
  • R running or runnable (on run queue)
  • S interruptible sleep (waiting for an event to complete)
  • T stopped by job control signal
  • t stopped by debugger during the tracing
  • W paging (not valid since the 2.6.xx kernel)
  • X dead (should never be seen)
  • Z defunct ("zombie") process, terminated but not reaped by its parent

使用 htop/top 可以查看所有進程的狀態信息,特別在幾種情況下常用

  • 查看過多的僵尸進程
  • 當平均負載過大時
# 第二行可以統計所有進程的狀態信息
$ top
...
Tasks: 214 total,   1 running, 210 sleeping,   0 stopped,   3 zombie
...

進程內存

ps -O rss 指定 rss 可以查看進程的內存,另外還有命令 top/htop 與 pidstat -r

# 查看 2579 PID 的內存
# -O rss 代表附加 RSS 信息進行打印
$ ps -O rss 2579
 PID   RSS S TTY          TIME COMMAND

實時查看進程內存

pidstat -sr

# 查看 23097 PID 的內存信息,每隔一秒打印一次
# -r: 查看進程的內存信息
# -s: 查看進程的 stack 信息
# -p: 指定 PID
# 1: 每間隔 1s 打印一次
# 5: 共打印 5 組
$ pidstat -sr -p 23097 1 5
Linux 3.10.0-693.2.2.el7.x86_64 (shanyue)       07/18/19        _x86_64_        (2 CPU)

18:56:07      UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM StkSize  StkRef  Command
18:56:08        0     23097      0.00      0.00  366424  95996   2.47    136      80  node

18:56:08      UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM StkSize  StkRef  Command
18:56:09        0     23097      0.00      0.00  366424  95996   2.47    136      80  node

18:56:09      UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM StkSize  StkRef  Command
18:56:10        0     23097      0.00      0.00  366424  95996   2.47    136      80  node

18:56:10      UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM StkSize  StkRef  Command
18:56:11        0     23097      0.00      0.00  366424  95996   2.47    136      80  node

18:56:11      UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM StkSize  StkRef  Command
18:56:12        0     23097      0.00      0.00  366424  95996   2.47    136      80  node

Average:      UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM StkSize  StkRef  Command
Average:        0     23097      0.00      0.00  366424  95996   2.47    136      80  node

頁表與缺頁異常

pidstat -s 中 minflt 與 majflt 代表缺頁異常

$ pidstat -s -p 23097 1 5
Linux 3.10.0-693.2.2.el7.x86_64 (shanyue)       07/18/19        _x86_64_        (2 CPU)

18:56:07      UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM StkSize  StkRef  Command
18:56:08        0     23097      0.00      0.00  366424  95996   2.47    136      80  node

18:56:08      UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM StkSize  StkRef  Command
18:56:09        0     23097      0.00      0.00  366424  95996   2.47    136      80  node

標準輸出定位到文件中

列出打開的文件

lsof, list open files

# 列出打開的文件
$ lsof
COMMAND     PID   TID     USER   FD      TYPE             DEVICE    SIZE/OFF       NODE NAME
systemd       1           root  cwd       DIR              253,1        4096          2 /
systemd       1           root  rtd       DIR              253,1        4096          2 /

容器中 namespace PID -> global PID 映射

換一個問題就是,如何找出 Docker 容器中的 pid 在宿主機對應的 pid

# 容器環境

# 已知容器中該進程 PID 為 122
# 在容器中找到對應 PID 的信息,在 /proc/$pid/sched 中包含宿主機的信息
$ cat /proc/122/sched
node (7477, #threads: 7)
...
# 宿主機環境

# 7477 就是對應的 global PID,在宿主機中可以找到
# -p 代表指定 PID
# -f 代表打印更多信息
$ ps -fp 7477
UID        PID  PPID  C STIME TTY          TIME CMD
root      7477  7161  0 Jul10 ?        00:00:38 node index.js

global PID -> namespace PID 映射

換一個問題就是, 已知宿主機的 PID,如何找出對應的容器

常見的場景就是使用 top/htop 定位到占用內存/CPU過高的進程,此時需要定位到它所在的容器

# 通過 docker inspect 查找到對應容器
$ docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.ID}}' | grep 22932

# 通過 cgroupfs 找到對應容器
$ cat /etc/22932/cgroup

幸運地是有人已經在 stackoverflow 上總結出來了

  • stackoverflow.com/questions/2…

SWAP

# 查找關于
$ vmstat -s

inode

# -i: 打印 inode number
$ ls -lahi

網絡吞吐量

  • 帶寬: 指網絡鏈路的最大傳輸速率
  • 吞吐量: 代表單位時間內成功傳輸的數據量,單位為 b/s (KB/s, MB/s)
  • PPS: pck/s (Packet Per Second),以網絡包為單位的傳輸速率
# 查看網卡信息
$ ifconfig eth0

$ sar -n DEV 1 | grep eth0
#                IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
16:34:37         eth0      8.00      2.00      0.69      1.90      0.00      0.00      0.00
16:34:38         eth0     39.00     27.00      2.91     38.11      0.00      0.00      0.00
16:34:39         eth0     13.00     11.00      0.92     13.97      0.00      0.00      0.00
16:34:40         eth0     16.00     16.00      1.21     20.86      0.00      0.00      0.00
16:34:41         eth0     17.00     17.00      1.51     15.27      0.00      0.00      0.00
Average:         eth0     18.60     14.60      1.45     18.02      0.00      0.00      0.00

socket 狀態

socket 信息

推薦使用 ss,不過 netstat 仍需要掌握,在特定條件 (docker 中) 有可能沒有 ss 命令。

# -t TCP
# -a 所有狀態
# -n 顯示數字地址和端口號
# -p 顯示 pid
$ netstat -tanp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.11:35283        0.0.0.0:*               LISTEN      -
tcp        0      0 192.168.112.2:37344     172.18.0.1:6379         ESTABLISHED 78/node
tcp        0      0 :::80                   :::*                    LISTEN      78/node
  • Recv-Q 與 Send-Q 不為0時,表示網絡包堆積,需要注意

協議信息

# 展示對每個協議的統計信息
$ netstat -s

# 展示對每個協議的統計信息
$ ss -s
Total: 1468 (kernel 1480)
TCP:   613 (estab 270, closed 315, orphaned 0, synrecv 0, timewait 41/0), ports 0

Transport Total     IP        IPv6
*         1480      -         -
RAW       0         0         0
UDP       30        22        8
TCP       298       145       153
INET      328       167       161
FRAG      0         0         0

# 也可以這樣統計 estab socket 的數量
$ netstat -tanp | grep ESTAB | wc -l

TCP 連接數

PostgresSQL 的最大連接數與當前連接數

-- 最大連接數
show max_connections;

-- 當前連接數
select count(*) from pg_stat_activity;

MySQL 的最大連接數與當前連接數

-- 最大連接數
show variables like 'max_connections';

-- 當前連接數
show full processlist;

分享到:
標簽:linux 調優
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定