在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

程序和進程的區別

馬哥Linux運維 ? 來源:博客園coder雪山 ? 2024-11-25 16:03 ? 次閱讀

1.介紹

1.什么是進程

比如: 開發寫的代碼我們稱為程序,那么將開發的代碼運行起來。我們稱為進程。

總結一句話就是: 當我們運行一個程序,那么我們將運行的程序叫進程。

PS1: 當程序運行為進程后,系統會為該進程分配內存,以及進程運行的身份和權限。

PS2: 在進程運行的過程中,系統會有各種指標來表示當前運行的狀態。

2.程序和進程的區別

1.程序是數據和指令的集合,是一個靜態的概念。比如/bin/ls、/bin/cp等二進制文件。同時程序可以長期存在系統中。

2.進程是程序運行的過程,是一個動態的概念。進程是存在生命周期的概念的,也就是說進程會隨著程序的終止而銷毀,不會永久存在系統中。

3.進程的生命周期

生命周期就是指一個對象的生老病死。用處很廣。

5ea13168-a98f-11ef-93f3-92fbcf53809c.jpg

當父進程接收到任務調度時,會通過fock派生子進程來處理,那么子進程會繼承父進程屬性。

1.子進程在處理任務代碼時,父進程會進入等待狀態中…

2.子進程在處理任務代碼后,會執行退出,然后喚醒父進程來回收子進程的資源。

3.如果子進程在處理任務過程中,父進程退出了,子進程沒有退出,那么這些子進程就沒有父進程來管理了,就變成僵尸進程。

PS: 每個進程都父進程的PPID,子進程則叫PID。

例: 假設現在我是蔣先生(system進程)….故事持續中…..

2.監控進程狀態

程序在運行后,我們需要了解進程的運行狀態。查看進程的狀態分為: 靜態和動態兩種方式

1.使用ps命令查看當前的進程狀態(靜態)

1)示例、ps -aux常用組合,查看進程 用戶、PID、占用cpu百分比、占用內存百分比、狀態、執行的命令等

5ea7d1da-a98f-11ef-93f3-92fbcf53809c.jpg

狀態 描述
USER 啟動進程的用戶
PID 進程運行的ID號
%CPU 進程占用CPU百分比
%MEM 進程占用內存百分比
VSZ 進程占用虛擬內存大小 (單位KB)
RSS 進程占用物理內存實際大小 (單位KB)
TTY 進程是由哪個終端運行啟動的tty1、pts/0等 ?表示內核程序與終端無關(遠程連接會通過tty打開一個bash:tty)
STAT 進程運行過程中的狀態 man ps (/STATE)
START 進程的啟動時間
TIME 進程占用 CPU 的總時間(為0表示還沒超過秒)
COMMAND 程序的運行指令,[ 方括號 ] 屬于內核態的進程。 沒有 [ ] 的是用戶態進程。systemctl status 指令

2.STAT狀態的S、Ss、S+、R、R、S+等等,都是什么意思?

5eb23fbc-a98f-11ef-93f3-92fbcf53809c.jpg

STAT基本狀態 描述 STAT狀態+符號 描述
R 進程運行 s 進程是控制進程, Ss進程的領導者,父進程
S 可中斷睡眠 < 進程運行在高優先級上,S<優先級較高的進程
T 進程被暫停 N 進程運行在低優先級上,SN優先級較低的進程
D 不可中斷睡眠 + 當前進程運行在前臺,R+該表示進程在前臺運行(正在io操作,一旦停止,數據丟失)
Z 僵尸進程 l 進程是多線程的,Sl表示進程是以線程方式運行

案例一、PS命令查看進程狀態切換


#1.在終端1上運行vim
[root@lqz ~]# vim oldboy


#2.在終端2上運行ps命令查看狀態
[root@lqz ~]# ps aux|grep oldboy    #S表示睡眠模式,+表示前臺運行
root      58118  0.4  0.2 151788  5320 pts/1    S+   22:11   0:00 oldboy
root      58120  0.0  0.0 112720   996 pts/0    R+   22:12   0:00 grep --color=auto oldboy
#在終端1上掛起vim命令,按下:ctrl+z 


#3.回到終端2再次運行ps命令查看狀態
[root@lqz ~]# ps aux|grep oldboy    #T表示停止狀態
root      58118  0.1  0.2 151788  5320 pts/1    T    22:11   0:00 vim oldboy
root      58125  0.0  0.0 112720   996 pts/0    R+   22:12   0:00 grep --color=auto oldboy

案例二、PS命令查看不可中斷狀態進程


#1.使用tar打包文件時,可以通過終端不斷查看狀態,由S+,R+變為D+
[root@lqz ~]# tar -czf etc.tar.gz /etc/ /usr/ /var/


[root@lqz ~]# ps aux|grep tar|grep -v grep
root      58467  5.5  0.2 127924  5456 pts/1    R+   22:22   0:04 tar -czf etc.tar.gz /etc/ 
[root@lqz ~]# ps aux|grep tar|grep -v grep
root      58467  5.5  0.2 127088  4708 pts/1    S+   22:22   0:03 tar -czf etc.tar.gz /etc/ 
[root@lqz ~]# ps aux|grep tar|grep -v grep
root      58467  5.6  0.2 127232  4708 pts/1    D+   22:22   0:03 tar -czf etc.tar.gz /etc/

查看進程 ps

 ps [options]

支持的命令格式

unix格式:-h -e

BSD格式:a,x,u

GNU長格式:--help

選項

[root@s22 ~]#ps
   PID TTY          TIME CMD
 28019 pts/4    0000 ps
 83674 pts/4    0000 bash
pid   終端       當前命令占用cpu的時間  命令
a 所有的終端
x 包括不連接終端的終端
u 顯示進程詳細信息
f 顯示進程樹
k 指定排序方式 ,默認是遞增,如果想遞減,則需要在排序的字段上加上-
o 指定顯示的屬性,不能跟u同時使用
L 獲取支持的選項,
-L 顯示線程
-e 相當于 ax
-f 顯示詳細信息,相當于u
-F 顯示更詳細信息
-H 顯示樹狀結構
-U username 獲取指定的用戶信息
常用選項: aux -ef -eFH

ps輸出屬性

VSZ 虛擬內存(程序認為可以獲取到的)

RSS 實際內存

psr cpu編號

STAT 狀態

%cpu cpu的占用率

%mem 內存的占用率

根據名稱來查詢進程

pidof name
[root@s22 ~]#pidof python
1169 825

2.使用top命令查看當前的進程狀態(動態)

5ec1a150-a98f-11ef-93f3-92fbcf53809c.jpg

任務 含義
Tasks: 129 total 當然進程的總數
1 running 正在運行的進程數
128 sleeping 睡眠的進程數
0 stopped 停止的進程數
0 zombie 僵尸進程數
%Cpu(s) 平均cpu使用率,按1 查看每個cup具體狀態
0.7 us 用戶進程占用cpu百分比
0.7 sys 內核進程占用百分比
0.0 ni 優先級進程占用cpu的百分比
98.7 id 空閑cup
0.0 wa CPU等待IO完成的時間,大量的io等待,會變高
0.0 hi 硬中斷,占的CPU百分比
0.0 si 軟中斷,占的CPU百分比
0.0 st 虛擬機占用物理CPU的時間


# w     load average:平均負載 一分鐘,5分鐘,15分鐘
 04:05:43 up 11:35,  3 users,  load average: 0.00, 0.01, 0.05
# uptime
 04:06:21 up 11:35,  3 users,  load average: 0.00, 0.01, 0.05

PS: 如何理解中斷這個東西

top 常見指令

字母 含義
h 查看幫出
1 數字1,顯示所有CPU核心的負載
z 以高亮顯示數據
b 高亮顯示處于R(進行中)狀態的進程
M 按內存使用百分比排序輸出
P 按CPU使用百分比排序輸出
q 退出top

# 第三方top
htop,top高級:yum install htop -y
iftop網卡流量:yum install iftop -y
glances,直觀的顯示:yum install glances -y
  -rz上傳文件,可以動態看到,網卡情況

下載新repo 到/etc/yum.repos.d/

wget-O/etc/yum.repos.d/epel.repohttps://mirrors.aliyun.com/repo/epel-7.repo
Epel 鏡像,第三方軟件庫
# 第三方top
htop,top高級:yum install htop -y
iftop網卡流量:yum install iftop -y
glances,直觀的顯示:yum install glances -y
  -rz上傳文件,可以動態看到,網卡情況

uptime

[root@s22 ~]#uptime 
 09:17:40 up 1 day, 22:19,  5 users,  load average: 2.14, 1.59, 0.84
 當前時間    當前服務器運行時長  當前的在線用戶數    cpu的負載 1分鐘 5分鐘 15分鐘
 cpu平均負載:在特定時間之內cpu運行的平均進程數,不超過cpu核心數的2倍認為為良好

top

首部信息

uptime信息 l 顯示與隱藏

tasks :進程總數,運行,睡眠數,停止數,僵尸進程 t

cpu信息:%Cpu(s): 0.3 us, 4.6 sy, 0.0 ni, 95.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

用戶空間 系統空間 nice值 空閑 等待 硬中斷 軟中斷 虛擬機偷走時間

內存信息 m

cpu分別顯示 1(數字)

排序:

模式是cpu的占用率 P

M:內存占用率

T: cpu的占用時間

退出:q

修改刷新頻率:s,默認是3秒

殺死進程:k,默認是第一個

W 保存文件

選項:

-d 刷新時間

-b 顯示所有的信息

-n # 指定刷新#次后退出

htop

epel源

3. 系統工具(epel三方庫下載),性能分析

free

顯示內存

-b 字節
-k kb
-m mb
-g gb
-h 人類易讀方式
-c # 刷新次數

vmstat


vmstat [options] [delay [count]]
[root@s22 ~]#vmstat 1 3 每秒刷新一次,刷新3次
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  37028 162708      0 808588    0    0     8     6   34   34  0  2 97  0  0
 0  0  37028 162560      0 808588    0    0     0     0 4535 6893  1  5 95  0  0
 0  0  37028 162544      0 808588    0    0     0     0 4463 6772  0  5 95  0  0
procs:
r:正在運行的進程個數
b:阻塞隊列的長度
memory:
swapd: 虛擬內容大小
free: 空閑物理內存的大小
buff:用于buff的大小
cache:用戶cache的大小
swap:
si:從磁盤交換到內存的數據速率(kb/s)
so: 從內存交換到磁盤的數據速率(kb/s)
io:
bi: 從磁盤讀取到系統的速率(kb/s)
bo: 從系統寫入到磁盤的速率(kb/s)
system:
in:中斷頻率
cs:進程之前切換的頻率
cpu:
us
sy
id
wa
st

iostat

查看磁盤讀寫速度

iostat 1 10

dstat 查看所有

-c cpu
-d 硬盤
-m 內存
-n 網絡
-p 進程
-r io請求
-s swap
--top-cpu 顯示占用cpu最多的進程
--top-io 顯示占用io最多的進程
--top-mem 顯示占用內存最多的進程
--tcp 顯示tcp的信息
--udp 顯示udp的信息

iftop 顯示網卡的流量

4.管理進程狀態,進程的管理工具

當程序運行為進程后,如果希望停止進程,怎么辦呢? 那么此時我們可以使用linux的kill命令對進程發送關閉信號。當然除了kill、還有killall,pkill

1.使用kill -l列出當前系統所支持的信號

5ecd3ca4-a98f-11ef-93f3-92fbcf53809c.jpg

雖然linux支持信號很多,但是我們僅列出我們最為常用的3個信號

數字編號 信號含義 信號翻譯
1 SIGHUP 通常用來重新加載配置文件,重新讀取一次參數的配置文件 (類似 reload)
9 SIGKILL 強制殺死進程(有狀態的服務(存磁盤的,如mysql)強制停止可能會導致下次起不來)
15 SIGTERM 終止進程,默認kill使用該信號

1.我們使用kill命令殺死指定PID的進程。


#1.給 vsftpd 進程發送信號 1,15
[root@lqz ~]# yum -y install vsftpd
[root@lqz ~]# systemctl start vsftpd
[root@lqz ~]# ps aux|grep vsftpd


#2.發送重載信號,例如 vsftpd 的配置文件發生改變,希望重新加載
[root@lqz ~]# kill -1 9160


#3.發送停止信號,當然vsftpd 服務有停止的腳本 systemctl stop vsftpd
[root@lqz ~]# kill 9160


#4.發送強制停止信號,當無法停止服務時,可強制終止信號
[root@lqz ~]# kill -9 9160

2.Linux系統中的killall、pkill命令用于殺死指定名字的進程。

我們可以使用kill命令殺死指定進程PID的進程,如果要找到我們需要殺死的進程,我們還需要在之前使用ps等命令再配合grep來查找進程,而killall、pkill把這兩個過程合二為一,是一個很好用的命令。


#例0、通過服務名稱殺掉進程
[root@lqz ~]# vim nginx.conf   # 修改為worker_processes  10;
[root@lqz ~]# kill -1 26093    # 平滑reload nginx,可以看到很多ngixn進程
[root@lqz ~]# kill 26121      # 殺掉一個子進程,會迅速的被master啟動起來,只是id號不一致了


[root@lqz ~]# kill  26093    # 主進程,子進程都會被殺掉 


#例1、通過服務名稱殺掉進程
[root@lqz ~]# pkill nginx
[root@lqz ~]# killall nginx


#例2、使用pkill踢出從遠程登錄到本機的用戶,終止pts/0上所有進程, 并且bash也結束(用戶被強制退出)
[root@lqz ~]# pkill -9 bash


# 一般程序都會有自己的啟動和停止
/usr/local/nginx/sbin/nginx -h

kill

向進程發送信號,實現對進程的管理,每個信號,對應不同的值,對應不同的含義,不區分大小寫

查詢可用信號:kill -l

常用信號:

1) sighub 不需要關閉程序,重新加載配置文件

2)sigint 終止進程,相當于ctrl+c

9) sigkill 強制殺死進程

15)sigterm 終止正在運行的進程

18)sigcont 繼續運行

19)sigstop 后臺休眠

按照pid: kill-n pid

按照名稱:killall -n name

按照名稱:pkill -n name

5.管理后臺進程,作業管理

1.什么是后臺進程

通常進程都會在終端前臺運行,一旦關閉終端,進程也會隨著結束,那么此時我們就希望進程能在后臺運行,就是將在前臺運行的進程放入后臺運行,這樣及時我們關閉了終端也不影響進程的正常運行。

2.我們為什么要將進程放入后臺運行

比如:我們此前在國內服務器往國外服務器傳輸大文件時,由于網絡的問題需要傳輸很久,如果在傳輸的過程中出現網絡抖動或者不小心關閉了終端則會導致傳輸失敗,如果能將傳輸的進程放入后臺,是不是就能解決此類問題了。

3.使用什么工具將進程放入后臺

早期的時候大家都選擇使用&符號將進程放入后臺,然后在使用jobs、bg、fg等方式查看進程狀態,但太麻煩了。也不直觀,所以我們推薦使用screen。

1.jobs、bg、fg的使用(強烈不推薦,了解即可)

[root@lqz ~]# sleep 3000 & //運行程序(時),讓其在后臺執行 
[root@lqz ~]# sleep 4000 //^Z,將前臺的程序掛起(暫停)到后臺 
[2]+ Stopped sleep 4000
[root@lqz ~]# ps aux |grep sleep
[root@lqz ~]# jobs  //查看后臺作業
[1]- Running sleep 3000 & 
[2]+ Stopped sleep 4000


[root@lqz ~]# bg %2     //讓作業 2 在后臺運行
[root@lqz ~]# fg %1     //將作業 1 調回到前臺
[root@lqz ~]# kill %1   //kill 1,終止 PID 為 1 的進程


[root@lqz ~]# (while :; do date; sleep 2; done) & //進程在后臺運行,但輸出依然在當前終端
[root@lqz ~]# (while :; do date; sleep 2; done) &>/dev/null &

2.screen的使用(強烈推薦,生產必用)


#1.安裝
[root@oldboy ~]# yum install screen -y


#2.開啟一個screen窗口,指定名稱
[root@oldboy ~]# screen -S wget_mysql


#3.在screen窗口中執行任務即可
[root@oldboy ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz --no-check-certificate


#4.平滑的退出screen,但不會終止screen中的任務。注意: 如果使用exit 才算真的關閉screen窗口
ctrl+a+d


#5.查看當前正在運行的screen有哪些
[root@oldboy ~]# screen -list
There is a screen on:
    22058.wget_mysql    (Detached)
1 Socket in /var/run/screen/S-root.


#6.進入正在運行的screen
[root@oldboy ~]# screen -r wget_mysql
[root@oldboy ~]# screen -r 22058


#7 終止(ctrl+d),退出才能停止screen
exit

前臺作業:一直占用終端的作業

后臺作業:不占用當前的終端

讓作業運行于后臺:

ctrl+z 對于啟動中

command & 也會輸出到終端,還是會終端顯示

nohup ping www.baidu.com &

脫離終端:

nohup command &>/dev/null &(黑洞)

nohup ping www.baidu.com &>/dev/null &

screen

-list 查看所有的screen窗口
-r 進入

6.進程的優先級[進階]

1.什么優先級

優先級指的是優先享受資源,比如排隊買票時,軍人優先、老人優先。等等

2.為什么要有系統優先級

舉個例子: 海底撈火鍋正常情況下響應就特別快,那么當節假日來臨時人員突增則會導致處理請求特別慢,那么假設我是海底撈VIP客戶(最高優先級),無論門店多么繁忙,我都不用排隊,海底撈人員會直接服務于我,滿足我的需求。至于沒有VIP的人員(較低優先級)則進入排隊等待狀態。(PS: 至于等多久,那…..)

3.系統中如何給進程配置優先級?

在啟動進程時,為不同的進程使用不同的調度策略。nice 值越高: 表示優先級越低,例如+19,該進程容易將CPU 使用量讓給其他進程。nice 值越低: 表示優先級越高,例如-20,該進程更不傾向于讓出CPU。

使用top或ps命令查看進程的優先級


#1.使用top可以查看nice優先級。  
NI: 實際nice級別,默認是0。 
PR: 顯示nice值,-20映射到0,+19映射到39


PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
1083 root      20   0  298628   2808   1544 S  0.3  0.1   2:49.28 vmtoolsd
5    root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:+


#2.使用ps查看進程優先級
[root@m01 ~]# ps axo command,nice |grep sshd|grep -v grep
/usr/sbin/sshd -D             0
sshd: root@pts/2              0

nice指定程序的優先級。語法格式 nice -n 優先級數字 進程名稱


#1.開啟vim并且指定程序優先級為-5
[root@m01 ~]# nice -n -5 vim &
[1] 98417


#2.查看該進程的優先級情況
[root@m01 ~]# ps axo pid,command,nice |grep 98417
 98417 vim    
                     -5

renice命令修改一個正在運行的進程優先級。語法格式 renice -n 優先級數字 進程pid


#1.查看sshd進程當前的優先級狀態
[root@m01 ~]# ps axo pid,command,nice |grep 折疊shd
 70840 sshd: root@pts/2              0
 98002 /usr/sbin/sshd -D             0
 
#2.調整sshd主進程的優先級
[root@m01 ~]# renice -n -20 98002
98002 (process ID) old priority 0, new priority -20


#3.調整之后記得退出終端
[root@m01 ~]# ps axo pid,command,nice |grep 折疊shd
 70840 sshd: root@pts/2              0
 98002 /usr/sbin/sshd -D           -20
[root@m01 ~]# exit


#4.當再次登陸sshd服務,會由主進程fork子進程(那么子進程會繼承主進程的優先級)
[root@m01 ~]# ps axo pid,command,nice |grep 折疊shd
 98002 /usr/sbin/sshd -D           -20
 98122 sshd: root@pts/0            -20

生產案例、Linux出現假死,怎么辦,又如何通過nice解決?

7.系統平均負載[進階]

每次發現系統變慢時,我們通常做的第一件事,就是執行 top 或者 uptime 命令,來了解系統的負載情況。比如像下面這樣,我在命令行里輸入了 uptime 命令,系統也隨即給出了結果。

[root@m01 ~]# uptime
 04:49:26 up 2 days,  2:33,  2 users,  load average: 0.70, 0.04, 0.05
#我們已經比較熟悉前面幾列,它們分別是當前時間、系統運行時間以及正在登錄用戶數。


# 而最后三個數字呢,依次則是過去 1 分鐘、5 分鐘、15 分鐘的平均負載(Load Average)。

1.什么是平均負載

平均負載不就是單位時間內的 CPU 使用率嗎?上面的 0.70,就代表 CPU 使用率是 70%。其實上并…..那到底如何理解平均負載: 平均負載是指單位時間內,系統處于可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數, PS: 平均負載與 CPU 使用率并沒有直接關系。

2.可運行狀態和不可中斷狀態是什么

1.可運行狀態進程,是指正在使用 CPU 或者正在等待 CPU 的進程,也就是我們ps 命令看到處于 R 狀態的進程。

2.不可中斷進程,(你做什么事情的時候是不能打斷的?) 系統中最常見的是等待硬件設備的 I/O 響應,也就是我們ps 命令中看到的 D 狀態(也稱為 Disk Sleep)的進程。

例如: 當一個進程向磁盤讀寫數據時,為了保證數據的一致性,在得到磁盤回復前,它是不能被其他進程或者中斷打斷的,這個時候的進程就處于不可中斷狀態。如果此時的進程被打斷了,就容易出現磁盤數據與進程數據不一致的問題。所以,不可中斷狀態實際上是系統對進程和硬件設備的一種保護機制。

劃重點,因此你可以簡單理解為,平均負載其實就是單位時間內的活躍進程數。

3.那平均負載為多少時合理

最理想的狀態是每個 CPU 上都剛好運行著一個進程,這樣每個 CPU 都得到了充分利用。所以在評判平均負載時,首先你要知道系統有幾個 CPU,這可以通過 top 命令獲取,或grep 'model name' /proc/cpuinfo

例1、假設現在在 4、2、1核的CPU上,如果平均負載為 2 時,意味著什么呢?

Q1.在4 個 CPU 的系統上,意味著 CPU 有 50% 的空閑。

Q2.在2 個 CPU 的系統上,意味著所有的 CPU 都剛好被完全占用。

Q3.而1 個 CPU 的系統上,則意味著有一半的進程競爭不到 CPU。

PS: 平均負載有三個數值,我們應該關注哪個呢?

實際上,我們都需要關注。就好比上海4月的天氣,如果只看晚上天氣,感覺在過冬天呢。但如果你結合了早上、中午、晚上三個時間點的溫度來看,基本就可以全方位了解這一天的天氣情況了。

1.如果 1 分鐘、5 分鐘、15 分鐘的三個值基本相同,或者相差不大,那就說明系統負載很平穩。

2.但如果 1 分鐘的值遠小于 15 分鐘的值,就說明系統最近 1 分鐘的負載在減少,而過去 15 分鐘內卻有很大的負載。

3.反過來,如果 1 分鐘的值遠大于 15 分鐘的值,就說明最近 1 分鐘的負載在增加,這種增加有可能只是臨時性的,也有可能還會持續上升,所以就需要持續觀察。

PS: 一旦 1 分鐘的平均負載接近或超過了 CPU 的個數,就意味著系統正在發生過載的問題,這時就得分析問題,并要想辦法優化了

在來看個例子3、假設我們在有2個 CPU 系統上看到平均負載為 2.73,6.90,12.98

那么說明在過去1 分鐘內,系統有 136% 的超載 (2.73/2=136%)

而在過去 5 分鐘內,有 345% 的超載 (6.90/2=345%)

而在過去15 分鐘內,有 649% 的超載,(12.98/2=649%)

但從整體趨勢來看,系統的負載是在逐步的降低。

4.那么在實際生產環境中,平均負載多高時,需要我們重點關注呢?

當平均負載高于 CPU 數量 70% 的時候,你就應該分析排查負載高的問題了。一旦負載過高,就可能導致進程響應變慢,進而影響服務的正常功能。

但 70% 這個數字并不是絕對的,最推薦的方法,還是把系統的平均負載監控起來,然后根據更多的歷史數據,判斷負載的變化趨勢。當發現負載有明顯升高趨勢時,比如說負載翻倍了,你再去做分析和調查。

5.平均負載與 CPU 使用率有什么關系

在實際工作中,我們經常容易把平均負載和 CPU 使用率混淆,所以在這里,我也做一個區分。可能你會疑惑,既然平均負載代表的是活躍進程數,那平均負載高了,不就意味著 CPU 使用率高嗎?

我們還是要回到平均負載的含義上來,平均負載是指單位時間內,處于可運行狀態和不可中斷狀態的進程數。所以,它不僅包括了正在使用 CPU 的進程,還包括等待 CPU 和等待 I/O 的進程。

而 CPU 使用率,是單位時間內 CPU 繁忙情況的統計,跟平均負載并不一定完全對應。比如:

CPU 密集型進程,使用大量 CPU 會導致平均負載升高,此時這兩者是一致的;

I/O 密集型進程,等待 I/O 也會導致平均負載升高,但 CPU 使用率不一定很高;

大量等待 CPU 的進程調度也會導致平均負載升高,此時的 CPU 使用率也會比較高。

6.平均負載案例分析實戰

下面,我們以三個示例分別來看這三種情況,并用 stress、mpstat、pidstat 等工具,找出平均負載升高的根源。

stress 是 Linux 系統壓力測試工具,這里我們用作異常進程模擬平均負載升高的場景。

mpstat 是多核 CPU 性能分析工具,用來實時查看每個 CPU 的性能指標,以及所有 CPU 的平均指標。

pidstat 是一個常用的進程性能分析工具,用來實時查看進程的 CPU、內存、I/O 以及上下文切換等性能指標。


#如果出現無法使用mpstat、pidstat命令查看%wait指標建議更新下軟件包
wget http://pagesperso-orange.fr/sebastien.godard/sysstat-11.7.3-1.x86_64.rpm
rpm -Uvh sysstat-11.7.3-1.x86_64.rpm

場景一:CPU 密集型進程

1.首先,我們在第一個終端運行 stress 命令,模擬一個 CPU 使用率 100% 的場景:

[root@m01 ~]# stress --cpu 1 --timeout 600

2.接著,在第二個終端運行 uptime 查看平均負載的變化情況


# 使用watch -d 參數表示高亮顯示變化的區域(注意負載會持續升高)
[root@m01 ~]# watch -d uptime
17:27:44 up 2 days,  3:11,  3 users,  load average: 1.10, 0.30, 0.17

3.最后,在第三個終端運行 mpstat 查看 CPU 使用率的變化情況


# -P ALL 表示監控所有 CPU,后面數字 5 表示間隔 5 秒后輸出一組數據
[root@m01 ~]# mpstat -P ALL 5
Linux 3.10.0-957.1.3.el7.x86_64 (m01)   2019年04月29日     _x86_64_    (1 CPU)


17時32分03秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
17時32分08秒  all   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
17時32分08秒    0   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00


#單核CPU所以只有一個all和0

4.從終端二中可以看到,1 分鐘的平均負載會慢慢增加到 1.00,而從終端三中還可以看到,正好有一個 CPU 的使用率為 100%,但它的 iowait 只有 0。這說明,平均負載的升高正是由于 CPU 使用率為 100% 。那么,到底是哪個進程導致了 CPU 使用率為 100% 呢?可以使用 pidstat 來查詢


# 間隔 5 秒后輸出一組數據
[root@m01 ~]# pidstat -u 5 1
Linux 3.10.0-957.1.3.el7.x86_64 (m01)   2019年04月29日     _x86_64_(1 CPU)


17時33分21秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
17時33分26秒     0    110019   98.80    0.00    0.00   98.80     0  stress


#從這里可以明顯看到,stress 進程的 CPU 使用率為 100%。

場景二:I/O 密集型進程

1.首先還是運行 stress 命令,但這次模擬 I/O 壓力,即不停地執行 sync

[root@m01 ~]# stress  --io 1 --timeout 600s

2.然后在第二個終端運行 uptime 查看平均負載的變化情況:

[root@m01 ~]# watch -d uptime
18:43:51 up 2 days,  4:27,  3 users,  load average: 1.12, 0.65, 0.00

3.最后第三個終端運行 mpstat 查看 CPU 使用率的變化情況:


# 顯示所有 CPU 的指標,并在間隔 5 秒輸出一組數據
[root@m01 ~]# mpstat -P ALL 5
Linux 3.10.0-693.2.2.el7.x86_64 (bgx.com)   2019年05月07日     _x86_64_    (1 CPU)


14時20分07秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
14時20分12秒  all    0.20    0.00   82.45   17.35    0.00    0.00    0.00    0.00    0.00    0.00
14時20分12秒    0    0.20    0.00   82.45   17.35    0.00    0.00    0.00    0.00    0.00    0.00


#會發現cpu的與內核打交道的sys占用非常高

4.那么到底是哪個進程,導致 iowait 這么高呢?我們還是用 pidstat 來查詢


# 間隔 5 秒后輸出一組數據,-u 表示 CPU 指標
[root@m01 ~]# pidstat -u 5 1
Linux 3.10.0-957.1.3.el7.x86_64 (m01)   2019年04月29日     _x86_64_(1 CPU)
18時29分37秒   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
18時29分42秒     0    127259   32.60    0.20    0.00   67.20   32.80     0  stress
18時29分42秒     0    127261    4.60   28.20    0.00   67.20   32.80     0  stress
18時29分42秒     0    127262    4.20   28.60    0.00   67.20   32.80     0  stress


#可以發現,還是 stress 進程導致的。

場景三:大量進程的場景

當系統中運行進程超出 CPU 運行能力時,就會出現等待 CPU 的進程。

1.首先,我們還是使用 stress,但這次模擬的是 4 個進程

[root@m01 ~]# stress -c 4 --timeout 600

2.由于系統只有 1 個 CPU,明顯比 4 個進程要少得多,因而,系統的 CPU 處于嚴重過載狀態

[root@m01 ~]# watch -d uptime
19:11:07 up 2 days,  4:45,  3 users,  load average: 4.65, 2.65, 4.65

3.然后,再運行 pidstat 來看一下進程的情況:


# 間隔 5 秒后輸出一組數據
[root@m01 ~]# pidstat -u 5 1
平均時間:   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
平均時間:     0    130290   24.55    0.00    0.00   75.25   24.55     -  stress
平均時間:     0    130291   24.95    0.00    0.00   75.25   24.95     -  stress
平均時間:     0    130292   24.95    0.00    0.00   75.25   24.95     -  stress
平均時間:     0    130293   24.75    0.00    0.00   74.65   24.75     -  stress

可以看出,4 個進程在爭搶 1 個 CPU,每個進程等待 CPU 的時間(也就是代碼塊中的 %wait 列)高達 75%。這些超出 CPU 計算能力的進程,最終導致 CPU 過載。

分析完這三個案例,我再來歸納一下平均負載與CPU

平均負載提供了一個快速查看系統整體性能的手段,反映了整體的負載情況。但只看平均負載本身,我們并不能直接發現,到底是哪里出現了瓶頸。所以,在理解平均負載時,也要注意:

平均負載高有可能是 CPU 密集型進程導致的;

平均負載高并不一定代表 CPU 使用率高,還有可能是 I/O 更繁忙了;

當發現負載高的時候,你可以使用 mpstat、pidstat 等工具,輔助分析負載的來源

安全

防火墻

綠盟

深信服

啟明星辰

飛塔

思科

華為

華三

(網關處的硬件防火墻)


4表5鏈
iptables -L 查看 防火墻策略
iptables -F 清空 防火墻
systemctl disable firewalld 開機并啟動
systemctl stop firewalled

selinux

美國國家安全局

配置文件 /etc/selinux/config

SELINUX=disabled # 關掉防火墻

setenforce 0 臨時生效

getenforce 查看selinux的狀態

紅帽認證

rhcea

rhce

rhca

思考認證:

ccnp

ccie

ccia

orcal認證:

ocp

鏈接:https://www.cnblogs.com/coderxueshan/p/17950646

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3025

    瀏覽量

    74042
  • 程序
    +關注

    關注

    117

    文章

    3787

    瀏覽量

    81038
  • 代碼
    +關注

    關注

    30

    文章

    4788

    瀏覽量

    68603
  • 進程
    +關注

    關注

    0

    文章

    203

    瀏覽量

    13961

原文標題:安全

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    進程和線程的區別

    系統對應用的并發性。進程和線程的區別在于:簡而言之,一個程序至少有一個進程,一個進程至少有一個線程. 線程的劃分尺度小于
    發表于 12-12 09:28

    進程和線程區別

    `1、進程和線程的區別和聯系進程(process)和線程(thread)是操作系統的基本概念,但是它們比較抽象,不容易掌握。計算機的核心是CPU,它承擔了所有的計算任務。它就像一座工廠,時刻
    發表于 11-30 14:06

    怎么區別進程和子進程

    怎么區別進程和子進程? 各位大神
    發表于 01-11 17:15

    線程、進程程序區別

    程序中同時運行多個線程完成不同的工作,稱為多線程。線程和進程區別在于,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個
    發表于 03-23 13:09

    線程,進程程序有什么區別

    我對于線程,進程的概念一直都是比較模糊,最近整理了一下。總結起來就是,線程是進程的一部分,進程程序的一部分。
    發表于 08-05 08:17

    進程和線程得區別在哪?

    1、進程和線程區別:1. 線程是程序執行的最小單位,而進程是操作系統分配資源的最小單位;2. 一個進程由一個或多個線程組成,線程是一個
    發表于 07-07 06:53

    進程是什么?進程程序區別在哪

    進程是什么?進程程序區別在哪?進程的狀態有哪幾種?
    發表于 12-23 06:27

    線程與進程有哪些區別

    線程和進程區別在于,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文。多
    發表于 07-20 07:48 ?1971次閱讀
    線程與<b class='flag-5'>進程</b>有哪些<b class='flag-5'>區別</b>?

    如何創建一個進程 程序進程區別

    那么,程序進程(process)的區別又是什么呢?
    的頭像 發表于 10-06 11:53 ?6589次閱讀

    進程和線程分別是什么,它們的區別是什么

    程和線程的區別是什么?有什么關系?相信大家對于進程都很熟悉了吧,而線程相對于進程而言,是一個更加接近于執行體的概念,為了讓大家更好的了解進程和線程,下面給大家介紹
    發表于 03-24 17:26 ?9390次閱讀
    <b class='flag-5'>進程</b>和線程分別是什么,它們的<b class='flag-5'>區別</b>是什么

    Linux開發概念:程序進程區別 進程之間交互

    正在執行的進程, 由于等待某個事件而無法執行時, 便被操作系統剝奪了cpu的操作時間, 這是就是阻塞態 引起阻塞的原因多種, 例如: 等待I/O操作, 更高優先級的任務搶走了CPU權限等.
    發表于 12-01 13:52 ?920次閱讀

    進程切換與線程切換有啥區別

    注意這個題目問的是進程**切換**與線程**切換**的區別,不是進程與線程的區別。當然這里的**線程指的是同一個進程中的線程**。 這
    的頭像 發表于 02-24 14:16 ?585次閱讀

    如何區分程序進程

    到目前為止,你肯定已經見過很多次這兩個詞了,“程序”“進程”。那程序進程到底有什么區別呢。 程序
    的頭像 發表于 02-24 14:17 ?1251次閱讀
    如何區分<b class='flag-5'>程序</b>與<b class='flag-5'>進程</b>

    程序進程和線程的區別

    什么是進程 1、進程和線程的區別 進程是指正在運行的程序,它擁有獨立的內存空間和系統資源,不同進程
    的頭像 發表于 06-22 11:39 ?671次閱讀
    <b class='flag-5'>程序</b>中<b class='flag-5'>進程</b>和線程的<b class='flag-5'>區別</b>

    mcu線程和進程區別是什么

    MCU線程和進程是嵌入式系統中常見的并行執行的概念,它們之間有許多區別,包括線程與進程的定義、資源管理、通信機制、執行方式等等。下面將詳細介紹MCU線程和進程
    的頭像 發表于 01-04 10:45 ?753次閱讀
    主站蜘蛛池模板: 精品乱人伦一区二区三区| 美国bj69video18视频| 又色又爽视频| 特级黄色毛片| 俄罗斯毛片基地| 国产大片免费观看中文字幕| 91九色porny蝌蚪| 久久艹免费视频| 九九热在线精品| 一级一片免费播放| 精品视频免费看| 国产大毛片| 婷婷六月综合| 69色综合| 亚洲成av人影片在线观看| 欧美一级在线观看| 欧美色图影院| 一区二区美女视频| 国产你懂的视频| 啪啪中文字幕| 拍拍拍无挡视频免费全程1000| 在线天堂bt种子资源| 男人天堂伊人| 久久久久88色偷偷免费| 亚洲宅男天堂a在线| 国产精品乳摇在线播放| 欧美人与zoxxxx另类9| 日本拍拍视频| 尻逼久久| 四虎影视地址| 天天摸天天操天天射| 精品一区二区三区在线视频| 国产一区高清| 操女人视频网站| 免费看污视频软件| 男人天堂综合网| 精品国产第一国产综合精品gif| 亚洲xx视频| 亚洲精品蜜桃久久久久久| 国产在线精品一区免费香蕉| 国产手机在线国内精品|