waitlinux腳本
『壹』 一般優化linux的內核,需要優化什麼參數
作為高性能WEB伺服器,只調整Nginx本身的參數是不行的,因為Nginx服務依賴於高性能的操作系統。
以下為常見的幾個Linux內核參數優化方法。
net.ipv4.tcp_max_tw_buckets
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_syn_retries
net.ipv4.tcp_synack_retries
net.ipv4.ip_local_port_range
net.ipv4.tcp_fin_timeout
net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
對於tcp連接,服務端和客戶端通信完後狀態變為timewait,假如某台伺服器非常忙,連接數特別多的話,那麼這個timewait數量就會越來越大。
畢竟它也是會佔用一定的資源,所以應該有一個最大值,當超過這個值,系統就會刪除最早的連接,這樣始終保持在一個數量級。
這個數值就是由net.ipv4.tcp_max_tw_buckets這個參數來決定的。
CentOS7系統,你可以使用sysctl -a |grep tw_buckets來查看它的值,默認為32768,
你可以適當把它調低,比如調整到8000,畢竟這個狀態的連接太多也是會消耗資源的。
但你不要把它調到幾十、幾百這樣,因為這種狀態的tcp連接也是有用的,
如果同樣的客戶端再次和服務端通信,就不用再次建立新的連接了,用這個舊的通道,省時省力。
該參數的作用是快速回收timewait狀態的連接。上面雖然提到系統會自動刪除掉timewait狀態的連接,但如果把這樣的連接重新利用起來豈不是更好。
所以該參數設置為1就可以讓timewait狀態的連接快速回收,它需要和下面的參數配合一起使用。
該參數設置為1,將timewait狀態的連接重新用於新的TCP連接,要結合上面的參數一起使用。
tcp三次握手中,客戶端向服務端發起syn請求,服務端收到後,也會向客戶端發起syn請求同時連帶ack確認,
假如客戶端發送請求後直接斷開和服務端的連接,不接收服務端發起的這個請求,服務端會重試多次,
這個重試的過程會持續一段時間(通常高於30s),當這種狀態的連接數量非常大時,伺服器會消耗很大的資源,從而造成癱瘓,
正常的連接進不來,這種惡意的半連接行為其實叫做syn flood攻擊。
設置為1,是開啟SYN Cookies,開啟後可以避免發生上述的syn flood攻擊。
開啟該參數後,服務端接收客戶端的ack後,再向客戶端發送ack+syn之前會要求client在短時間內回應一個序號,
如果客戶端不能提供序號或者提供的序號不對則認為該客戶端不合法,於是不會發ack+syn給客戶端,更涉及不到重試。
該參數定義系統能接受的最大半連接狀態的tcp連接數。客戶端向服務端發送了syn包,服務端收到後,會記錄一下,
該參數決定最多能記錄幾個這樣的連接。在CentOS7,默認是256,當有syn flood攻擊時,這個數值太小則很容易導致伺服器癱瘓,
實際上此時伺服器並沒有消耗太多資源(cpu、內存等),所以可以適當調大它,比如調整到30000。
該參數適用於客戶端,它定義發起syn的最大重試次數,默認為6,建議改為2。
該參數適用於服務端,它定義發起syn+ack的最大重試次數,默認為5,建議改為2,可以適當預防syn flood攻擊。
該參數定義埠范圍,系統默認保留埠為1024及以下,以上部分為自定義埠。這個參數適用於客戶端,
當客戶端和服務端建立連接時,比如說訪問服務端的80埠,客戶端隨機開啟了一個埠和服務端發起連接,
這個參數定義隨機埠的范圍。默認為32768 61000,建議調整為1025 61000。
tcp連接的狀態中,客戶端上有一個是FIN-WAIT-2狀態,它是狀態變遷為timewait前一個狀態。
該參數定義不屬於任何進程的該連接狀態的超時時間,默認值為60,建議調整為6。
tcp連接狀態里,有一個是established狀態,只有在這個狀態下,客戶端和服務端才能通信。正常情況下,當通信完畢,
客戶端或服務端會告訴對方要關閉連接,此時狀態就會變為timewait,如果客戶端沒有告訴服務端,
並且服務端也沒有告訴客戶端關閉的話(例如,客戶端那邊斷網了),此時需要該參數來判定。
比如客戶端已經斷網了,但服務端上本次連接的狀態依然是established,服務端為了確認客戶端是否斷網,
就需要每隔一段時間去發一個探測包去確認一下看看對方是否在線。這個時間就由該參數決定。它的默認值為7200秒,建議設置為30秒。
該參數和上面的參數是一起的,服務端在規定時間內發起了探測,查看客戶端是否在線,如果客戶端並沒有確認,
此時服務端還不能認定為對方不在線,而是要嘗試多次。該參數定義重新發送探測的時間,即第一次發現對方有問題後,過多久再次發起探測。
默認值為75秒,可以改為3秒。
第10和第11個參數規定了何時發起探測和探測失敗後再過多久再發起探測,但並沒有定義一共探測幾次才算結束。
該參數定義發起探測的包的數量。默認為9,建議設置2。
設置和範例
在Linux下調整內核參數,可以直接編輯配置文件/etc/sysctl.conf,然後執行sysctl -p命令生效
『貳』 linux下如何監聽進程
一、supervise
Supervise是daemontools的一個工具,可以用來監控管理unix下的應用程序運行情況,在應用程序出現異常時,supervise可以重新啟動指定程序。
使用:
mkdir test
cd test
vim run 寫入希望執行的操作
supervise test (注意這里是的參數是run文件上層的文件夾,改變run的為可執行 chmod +x run)
二、monit
monit是一個小型的開放源碼工具來管理和監控Unix系統。Monit可以自動維護進程,及時避免進程異常退出等產生的問題。
系統: monit可以監控問題的發生,包括進程狀態、系統cpu負載、內存佔用情況等,例如當apache服務的cpu負載以及內存閘弄情況過高時候,它會重啟apache服務。
進程: monit可以監控守護進程,包括系統進程。例如當某個進行down掉,它會自動恢復重啟該進程。
文件系統:Monit可以監控本地文件、目錄、文件系統的變化,包括時間戳、校驗值、大小的變化。例如,可以監控文件sha1以及md5的值,來監控文件是否發生變化。
網路:monit可以監控網路連接,支持TCP、UDP、Unix domain sockets以及HTTP、SMTP等。
定時腳本:monit可以用來定時測試程序和腳本,獲取程序輸出結果,進而判斷是否成功或其他情況。
安裝:
sudo apt-get install monit
編輯配置:
sudo vim /etc/monit/monitrc
啟動、停止、重啟:
sudo /etc/init.d/monit start
sudo /etc/init.d/monit stop
sudo /etc/init.d/monit restart
設置頁面監控狀態:
set httpd port 2812 and
allow 0.0.0.0/0.0.0.0
allow localhost
增加監控:
需要注意的是,這里需要添加start和stop,缺一個都是不行的
1.根據程序名稱來監控
check process test with MATCHING test.py
start program = "/home/yxd/test.py"
stop program = "xxxxx"
2.根據pid監控
check process apache with pidfile /var/run/httpd.pid
start program = "/etc/init.d/rcWebServer.sh start https"
stop program = "/etc/init.d/rcWebServer.sh stop https"
if changed pid then aler
參考:用monit監控系統關鍵進程
supervisord
Supervisor是一個C/S系統,它可以在類unix操作系統讓用戶來監視和控制後台服務進程的數量。它是由python編寫的,常用於進程異常退出的重啟保護。
安裝:
pip install supervisor
查看配置文件:
echo_supervisord_conf
從該命令的結果中,可以看到各個模塊的配置信息。
創建配置文件:
echo_supervisord_conf > /etc/supervisord.conf
配置應用:
[program:test]
command=python /root/test_supervisor.py
process_name=%(program_name)s
stdout_logfile=/root/test.log
stderr_logfile=/root/test.log
保存,啟動:
/usr/bin/supervisord -c /etc/supervisord.conf
『叄』 linux文件系統怎樣初始化步驟
System V init啟動過程
概括地講,Linux/Unix系統一般有兩種不同的初始化啟動方式.
1) BSD system init
2) System V init
大多數發行套件的Linux使用了與System V init相仿的init也就是Sys V init,它比傳統的BSD system init更容易且更加靈活。
System V init的主要思想是定義了不同的"運行級別(runlevel)"。通過配置文件/etc/inittab定義了系統引導時的運行級別, 進入或者切換到一個運行級別時做什麼。每個運行級別對應於一個子目錄/etc/rc.d/rcX.d。
每個rcX.d目錄中都是一些以S或K開頭的文件鏈接。這些鏈接指向的腳本都 可以接收start和stop參數,S開頭的鏈接會傳入start參數,一般是開啟一項服務,K會傳入stop參數,一般是停止某服務。
以下是一個大致的System V init過程:
(1)init 過程執行的第一個腳本是 /etc/rc.d/rc.sysinit,它主要做在各個運行級別中進行初始化工作,包括: 啟動交換分區;檢查磁碟;設置主機名;檢查並掛載文件系統;載入並初始化硬體模塊.
(2)執行預設的運行級別模式。 這一步的內容主要在/etc/inittab中體現, inittab文件會告訴init進程要進入什麼運行級別,以及在哪裡可以找到該運行級別的配置文件.
(3)執行/etc/rc.d/rc.local腳本文件。 這也是init過程中執行的最後一個腳本文件,所以用戶可以在這個文件中添加一些需要在登錄之前執行的命令.
(4)執行/bin/login程序
注意:
System V init只是一種模式,每個系統初始化都有差異,但大體上不會相差太多。如busybox執行的第一個啟動腳本就是/etc/init.d/rcS,而且不可以改變,與上面講的不同。
LFS文件系統初始化示例
inittab文件
由下內容可以看出,最先執行的是/etc/rc.d/init.d/rc文件,給這個文件傳入的參數是一個數字,rc會由傳入的數字合成rcX.d目錄的路徑,然後執行其中的所有腳本鏈接。當然這只是一部分功能。
# Begin /etc/inittab
id:3:initdefault:
<em><strong>si::sysinit:/etc/rc.d/init.d/rc sysinit</strong></em> #可以設定初始化腳本
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
...
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S016:once:/sbin/sulogin
1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
...
# End /etc/inittab
etc目錄結構
只是一部分,有刪減。
.
├── fstab
├── <em>inittab</em>
├── inputrc
├── profile
├── rc.d
│ ├── init.d
│ │ ├── checkfs
│ │ ├── cleanfs
...
│ │ ├── moles
│ │ ├── mountfs
│ │ ├── mountkernfs
│ │ ├── network
│ │ ├── rc #when boot, run.
│ │ ├── reboot
...
│ ├── rc0.d
│ │ ├── K80network -> ../init.d/network
│ │ ├── K90sysklogd -> ../init.d/sysklogd
│ │ ├── S60sendsignals -> ../init.d/sendsignals
│ │ ├── S70mountfs -> ../init.d/mountfs
│ │ ├── S80swap -> ../init.d/swap
│ │ ├── S90localnet -> ../init.d/localnet
│ │ └── S99halt -> ../init.d/halt
│ ├── rc1.d
│ │ ├── K80network -> ../init.d/network
│ │ └── K90sysklogd -> ../init.d/sysklogd
│ ├── rc2.d
│ │ ├── K80network -> ../init.d/network
│ │ └── K90sysklogd -> ../init.d/sysklogd
│ ├── rc3.d
│ │ ├── S10sysklogd -> ../init.d/sysklogd
│ │ └── S20network -> ../init.d/network
│ ├── rc4.d
│ │ ├── S10sysklogd -> ../init.d/sysklogd
│ │ └── S20network -> ../init.d/network
│ ├── rc5.d
│ │ ├── S10sysklogd -> ../init.d/sysklogd
│ │ └── S20network -> ../init.d/network
│ ├── rc6.d
│ │ ├── K80network -> ../init.d/network
│ │ ├── K90sysklogd -> ../init.d/sysklogd
│ │ ├── S60sendsignals -> ../init.d/sendsignals
│ │ ├── S70mountfs -> ../init.d/mountfs
│ │ ├── S80swap -> ../init.d/swap
│ │ ├── S90localnet -> ../init.d/localnet
│ │ └── S99reboot -> ../init.d/reboot
│ └── rcsysinit.d
│ ├── S00mountkernfs -> ../init.d/mountkernfs
│ ├── S02consolelog -> ../init.d/consolelog
│ ├── S05moles -> ../init.d/moles
...
├── udev
│ ├── rules.d
│ │ └── 55-lfs.rules
│ └── udev.conf
└── vimrc
network腳本
#!/bin/sh
. /etc/sysconfig/rc
. ${rc_functions}
. /etc/sysconfig/network
case "${1}" in
start)
# Start all network interfaces
for file in ${network_devices}/ifconfig.*
do
interface=${file##*/ifconfig.}
# skip if $file is * (because nothing was found)
if [ "${interface}" = "*" ]
then
continue
fi
IN_BOOT=1 ${network_devices}/ifup ${interface}
done
;;
stop)
# Reverse list
FILES=""
for file in ${network_devices}/ifconfig.*
do
FILES="${file} ${FILES}"
done
# Stop all network interfaces
for file in ${FILES}
do
interface=${file##*/ifconfig.}
# skip if $file is * (because nothing was found)
if [ "${interface}" = "*" ]
then
continue
fi
IN_BOOT=1 ${network_devices}/ifdown ${interface}
done
;;
restart)
${0} stop
sleep 1
${0} start
;;
*)
echo "Usage: ${0} {start|stop|restart}"
exit 1
;;
esac
# End /etc/rc.d/init.d/network
『肆』 linux終端 的init0命令是用來幹嘛的
是關閉機器。為了更好的了解init命令,特轉發:
一、什麼是INIT:
init是Linux系統操作中不可缺少的程序之一。
所謂的init進程,它是一個由內核啟動的用戶級進程。
內核自行啟動(已經被載入內存,開始運行,並已初始化所有的設備驅動程序和數據結構等)之後,就通過啟動一個用戶級程序init的方式,完成引導進程。所以,init始終是第一個進程(其進程編號始終為1)。
內核會在過去曾使用過init的幾個地方查找它,它的正確位置(對Linux系統來說)是/sbin/init。如果內核找不到init,它就會試著運行/bin/sh,如果運行失敗,系統的啟動也會失敗。
二、運行級別
那麼,到底什麼是運行級呢?
簡單的說,運行級就是操作系統當前正在運行的功能級別。這個級別從1到6 ,具有不同的功能。
不同的運行級定義如下:(可以參考Red Hat Linux 裡面的/etc/inittab)
# 0 - 停機(千萬不能把initdefault 設置為0 )
# 1 - 單用戶模式
# 2 - 多用戶,沒有 NFS
# 3 - 完全多用戶模式(標準的運行級)
# 4 - 沒有用到
# 5 - X11 (xwindow)
# 6 - 重新啟動 (千萬不要把initdefault 設置為6 )
這些級別在/etc/inittab 文件里指定。這個文件是init 程序尋找的主要文件,最先運行的服務是放在/etc/rc.d 目錄下的文件。在大多數的Linux 發行版本中,啟動腳本都是位於 /etc/rc.d/init.d中的。這些腳本被用ln 命令連接到 /etc/rc.d/rcn.d 目錄。(這里的n 就是運行級0-6)
三、運行級別的配置
運行級別的配置是在/etc/inittab行內進行的,如下所示:
12 : 2 : wait : / etc / init.d / rc 2
第一個欄位是一個任意指定的標簽;
第二個欄位表示這一行適用於運行那個級別(這里是2);
第三個字 段表示進入運行級別時,init應該運行第四個欄位內的命令一次,而且init應該等待該命令結束。/etc/init.d/rc命令運行啟動和終止輸入以便進入運行級別2時所需的任何命令。
第四個欄位中的命令執行設置運行級別時的一切「雜活」。它啟動已經沒有運行的服務,終止不應該再在新運行級別內運行的服務。根據Linux版本的不同,採用的具體命令也不同,而且運行級別的配置也是有差別的。
init啟動時,它會在/etc/inittab內查找一個代碼行,這一行指定了默認的運行級別:
id : 2 : initdefault :
你可以要求init在啟動時,進入非默認運行級別,這是通過為內核指定一個「single」或「emergency」 命令行參數來實現的。比如說,內核命令行參數的指定可通過LILO來執行。這樣一來,你就可以選擇單用戶模式了(即運行級別1)。
系統正在運行時,telinit命令可更改運行級別。運行級別發生變化時, init 就會從/etc/inittab運行相應的命令。
四、/etc/inittab中的特殊配置
/etc/inittab中,有幾個特殊的特性,允許init重新激活特殊事件。這些特殊特性都是用第三個欄位中的特殊關鍵字標記出來的。比如:
1. powerwait
允許init在電源被切斷時,關閉系統。其前提是具有U P S和監視U P S並通知init電源已被切斷的軟體。
2. ctrlaltdel
允許init在用戶於控制台鍵盤上按下C t r l + A l t + D e l組合鍵時,重新啟動系統。注意,如果該系統放在一個公共場所,系統管理員可將C t r l + A l t + D e l組合鍵配置為別的行為,比如忽略等。
3. sysinit
系統啟動時准備運行的命令。比如說,這個命令將清除/tmp。
上面列出的特殊關鍵字尚不完整。其他的關鍵字及其使用詳情,可參考你的inittab手冊頁。
五、在單用戶模式下引導
一個重要的運行級別就是單用戶模式(運行級別1),該模式中,只有一個系統管理員使用特定的機器,而且盡可能少地運行系統服務,其中包含登錄。單用戶模式對少數管理任務(比如在/usr分區上運行fsck)而言,是很有必要的,因為這需要卸載分區,但這是不可能的,除非所有的服務系統已被殺死。
一個正在運行的系統可以進入單用戶模式,具體做法是利用init,請求運行級別1。內核啟動時,在內核命令行指定single或emergency關鍵字,就可進入運行級別1了。內核同時也為init指定命令行, init從關鍵字得知自己不應該採用默認的運行級別(內核命令行的輸入方式和你啟動系統的方式有關)。
有時,以單用戶模式進行啟動是必要的,這樣一來,用戶在裝入分區之前,或至少在裝入分散的/usr分區之前,能手工運行fsck(在分散的文件系統上,任何活動都可能使其更為分散,所以應該盡可能地運行fsck)。
如果自動化的fsck在啟動時失敗了,啟動腳本init的運行將自動進入單用戶模式。這樣做是為了防止系統使用不連貫的文件系統,這個文件系統是f s c k不能自動修復的。文件系統不連貫的現象極為少見,而且通常會導致硬碟的不連貫或實驗性的內核釋放,但最好能做到防患於未然。
由於安全上的考慮,在單用戶模式下,啟動外殼腳本之前,配置得當的系統會要求用戶提供root密碼。否則,它會簡單地為L I L O輸入合適的一行代碼,以r o o t的身份登錄(當然,如果/etc/passwd已經由於文件系統的問題而不連貫了,就不適合這里的原則了,為對付這種情況,你最好隨時准備一張啟動盤)。
不同的運行級有不同的用處,也應該根據自己的不同情形來設置。
例如,如果丟失了root口令,那麼可以讓機器啟動進入單用戶狀態。在啟動後的 lilo 提示符下輸入:
init=/bin/sh rw 使機器進入運行級1 ,並把 root 文件系統掛為讀寫。他會跳過所有系統認證,讓你可以使用passwd 程序來改變root口令,然後啟動到一個新的運行級
『伍』 將進程綁定到指定的CPU上
背景:為什麼要進程綁定到指定的CPU上?
1) 減少CPU切換開銷
CPU固定綁定到主機的指定CPU上,在整個運行期間,不會發生CPU浮動, 減少CPU切換開銷 ,提高虛擬機的計算性能。
2) 提供CPU cache的命中率
在多核運行的機器上,每個CPU自身會有緩存,緩存著進程使用的信息,而進程可能會被OS調度到其他CPU上,如此, CPU cache命中率 就低了,當綁定CPU後,程序就會一直在指定的cpu跑,不會由操作系統調度到其他CPU上,性能有一定的提高。
taskset:設置或檢索進程的CPU相關性
1) 如果沒有taskset命令, 安裝 包含taskset命令的util-linux工具集:yum install util-linux
2) 查看進程的CPU親和力 ,-p選項是一個十六進制數,-cp選項是一個cpu列表,表示相應的cpu核。3的二進制形式是0011,相應的第0位和第1位都是1,表示14795進程只能運行在cpu的第0個核和第1個核。
$ taskset -p 14795
pid 14795's current affinity mask: 3
$ taskset -cp 14795
pid 14795's current affinity list: 0,1
3) 綁定CPU : taskset -cp <CPU IDs> <Process ID>
$ taskset -cp 0 14795
pid 14795's current affinity list: 0,1
pid 14795's new affinity list: 0
OpenStack K版本引入了許多CPU高級特性功能,不僅支持自定義CPU拓撲功能,支持設置虛擬機CPU的socket、core、threads等,還支持CPU pinning功能,即CPU核綁定,甚至能夠配置虛擬機獨占物理CPU,虛擬機的vCPU能夠固定綁定到物理宿主機的指定pCPU上,在整個運行期間,不會發生CPU浮動,減少CPU切換開銷,提高虛擬機的計算性能。
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 40
On-line CPU(s) list: 0-39
Thread(s) per core: 2
Core(s) per socket: 10
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Model name: Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz
Stepping: 2
CPU MHz: 1201.480
BogoMIPS: 4603.87
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 25600K
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39
以上可知,該宿主機有兩個CPU(socket),每個CPU 10核(core),每個核可以開啟兩個 超線程(thread) ,即有40個邏輯CPU。宿主機CPU包含兩個NUMA node,其中node0包括0,2,4,...,38,node1包括1,3,5,...,39。
步驟1) 創建支持綁核的主機集合
不是所有的計算節點都支持CPU綁核特性,可以通過主機集合(host aggregate)把支持綁核CPU的主機放到一個集合中。
步驟2) 創建支持綁核的flavor
目前Nova並不支持啟動時直接指定主機集合的metadata(hint只支持指定server group),需要通過flavor的擴展屬性和主機集合的metadata匹配,將不匹配的主機濾掉,部署到匹配的主機上。flavor支持配置虛擬機的CPU拓撲、QoS、CPU pinning策略、NUMA拓撲以及PCI passthrough等擴展屬性。
步驟3) 通過步驟2) 的Flavor創建虛擬機,創建完成到虛機所在物理機上查看虛機綁核情況:
查詢方法1) virsh mpxml 虛機id
<vcpu placement='static'>8</vcpu>
<cputune>
<vcpupin vcpu='0' cpuset='25'/>
<vcpupin vcpu='1' cpuset='5'/>
<vcpupin vcpu='2' cpuset='8'/>
<vcpupin vcpu='3' cpuset='28'/>
<vcpupin vcpu='4' cpuset='9'/>
<vcpupin vcpu='5' cpuset='29'/>
<vcpupin vcpu='6' cpuset='24'/>
<vcpupin vcpu='7' cpuset='4'/>
<emulatorpin cpuset='4-5,8-9,24-25,28-29'/>
</cputune>
查詢方法2) 在虛擬機所運行的物理宿主機上執行virsh list找到相應虛機的實例id,然後virsh vcpupin 實例id可以查到該虛擬機所佔用的CPU具體核數。
# virsh vcpupin vm46 綁核的虛機
VCPU: CPU Affinity
----------------------------------
0: 25
1: 5
2: 8
3: 28
4: 9
5: 29
6: 24
7: 4
# virsh vcpupin vm6 未綁核的虛機
VCPU: CPU Affinity
----------------------------------
0: 0-39
1: 0-39
2: 0-39
3: 0-39
4: 0-39
5: 0-39
6: 0-39
7: 0-39
virsh vcpupin 子命令是KVM自帶的指令工具,它可以把vm實例的每個vcpu與宿主機的cpu對應綁定,這種綁定方式粒度更小。
# virsh vcpupin vm4 查看綁定情況
VCPU: CPU Affinity
----------------------------------
0: 0-23
1: 0-23
#默認2個vcpu沒有進行綁定,可以在0-23號cpu上切換
# virsh vcpuinfo vm4 查看CPU使用時長
VCPU: 0
CPU: 10 #運行在10號cpu上
State: running
CPU time: 14.2s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 1
CPU: 8 #運行在8號cpu上
State: running
CPU time: 6.8s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyy
# virsh vcpupin vm4 0 3 綁定虛機的第1個CPU到宿主機的第4號cpu上
# virsh vcpupin vm4 1 5 綁定虛機的第2個CPU到宿主機的第6號cpu上
# virsh vcpuinfo vm4
VCPU: 0
CPU: 3
State: running
CPU time: 14.5s
CPU Affinity: ---y--------------------
VCPU: 1
CPU: 5
State: running
CPU time: 7.3s
CPU Affinity: -----y------------------
# virsh vcpupin vm4
VCPU: CPU Affinity
----------------------------------
0: 3
1: 5
三種方法的相同點:都能實現綁核效果
優劣勢對比:openstack支持虛機重生虛擬遷移到其他物理主機上,第1種方法在這些操作後綁核還是有效的,但2和3就不會綁核的。此外,第1種方法是自動的,2和3是手動的,可以作為臨時補救方法。
在虛擬機上執行高密度計算,測試的Python腳本如下:
# test_compute.py
k = 0
for i in xrange(1, 100000):
for j in xrange(1, 100000):
k = k + i * j
使用shell腳本同時跑50個進程,保證CPU滿載運行:
for i in `seq 1 50`; do
python test_compute.py &
done
使用sar命令查看宿主機CPU使用情況:
sar -P ALL 1 100
結果如下:
Linux 3.10.0-229.20.1.el7.x86_64 (8409a4dcbe1d11af) 05/10/2018 _x86_64_ (40 CPU)
10:20:14 PM CPU %user %nice %system %iowait %steal %idle
10:20:15 PM all 20.48 0.00 0.15 0.03 0.00 79.34
10:20:15 PM 0 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 1 0.99 0.00 0.00 0.00 0.00 99.01
10:20:15 PM 2 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 3 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 4 100.00 0.00 0.00 0.00 0.00 0.00
10:20:15 PM 5 100.00 0.00 0.00 0.00 0.00 0.00
10:20:15 PM 6 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 7 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 8 100.00 0.00 0.00 0.00 0.00 0.00
10:20:15 PM 9 100.00 0.00 0.00 0.00 0.00 0.00
10:20:15 PM 10 1.01 0.00 0.00 0.00 0.00 98.99
10:20:15 PM 11 1.00 0.00 0.00 0.00 0.00 99.00
10:20:15 PM 12 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 13 0.00 0.00 0.99 0.00 0.00 99.01
10:20:15 PM 14 0.99 0.00 0.99 0.00 0.00 98.02
10:20:15 PM 15 1.00 0.00 0.00 0.00 0.00 99.00
10:20:15 PM 16 0.99 0.00 0.99 0.00 0.00 98.02
10:20:15 PM 17 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 18 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 19 3.96 0.00 0.99 0.00 0.00 95.05
10:20:15 PM 20 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 21 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 22 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 23 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 24 100.00 0.00 0.00 0.00 0.00 0.00
10:20:15 PM 25 100.00 0.00 0.00 0.00 0.00 0.00
10:20:15 PM 26 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 27 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 28 100.00 0.00 0.00 0.00 0.00 0.00
10:20:15 PM 29 100.00 0.00 0.00 0.00 0.00 0.00
10:20:15 PM 30 2.00 0.00 0.00 0.00 0.00 98.00
10:20:15 PM 31 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 32 2.97 0.00 0.99 0.00 0.00 96.04
10:20:15 PM 33 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 34 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 35 1.00 0.00 0.00 0.00 0.00 99.00
10:20:15 PM 36 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 37 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 38 0.00 0.00 0.00 0.00 0.00 100.00
10:20:15 PM 39 0.00 0.00 0.00 0.00 0.00 100.00
從CPU使用情況看宿主機的pCPU 4-5,8-9,24-25,28-29使用率100%,並且整個過程中沒有浮動,符合我們的預期結果,說明CPU核綁定成功。
『陸』 CURL在shell下可以用多線程么
享Linux模擬線程並發腳本使用腳本同批量定義數量伺服器執行相關命令比起普通for/while循環能順序條條執行效率高非管理批伺服器非實用
腳本功能通scp(選rsync)向千台伺服器傳更新包腳本運行同台50scp進程向伺服器傳包
#!/bin/bash
ip=`cat iplist.txt|grep -v "#"|awk '{print $1}'` #濾伺服器IP
dir='/usr/local/src' #目標路徑
thead_num=50 #自定義並發數根據自身伺服器性能或應用調整始千萬別定義太避免管理機宕機
tmp_fifo_file="/tmp/$$.fifo" #進程ID號命名管道文件
mkfifo $tmp_fifo_file #創建臨管道文件
exec 4>$tmp_fifo_file #讀寫式打tmp_fifo_file管道文件,文件描述符4取3-9任意描述符
rm -f $tmp_fifo_file #刪除臨管道文件刪除
for ((i=0;i<$thead_num;i++)) #利用for循環向管道輸入並發數量空行
do
echo "" #輸空行
done >&4 #輸重導向定義文件描述符4
for i in $ip #循環所要執行伺服器
do
read -u4 #管道讀取行每行所行讀取完畢執行掛起直管道空閑行
{
scp -P 1000 $1 $i:$dir #所要批量執行命令都放括弧內scp簡單實例替換任意其命令及命令組1000伺服器端埠
sleep 3 #暫停3秒給系統緩沖間達限制並發進程數量
echo "" >&4 #再寫入空行使掛起循環繼續執行
}& #放入台執行
done
wait #等待所台進程執行完
exec 4>&- #刪除文件描述符
exit 0
『柒』 linux shell 腳本運行完畢後不能自動停止
最簡單方法:
其實,你按一下回車就可以知道是否"結束"了吧?
更好的辦法:
你在done後面加多兩行:
------------代碼開始------------
wait
echo "All is ok"
exit 0
------------代碼結束------------
參考資料:
wait 命令
http://book.51cto.com/art/201205/338877.htm
『捌』 在Linux系統中使用Shell實現多線程運行任務(多任務並發執行) 2022-05-30
最近,有一批任務需要把兩批的fastq合並到一起並壓縮成一個fastq文件才能繼續往下做,由於存儲空間有限又不能直接全部跑上,只能按樣本逐個分批跑。眾所周知,一般fastq是成對存在的,所需要對read1和read2分別合並一次,然而這次任務的fastq文件比較大,合並然後壓縮一次需要1天左右,那對於一組fastq就要2-3天,這也太耗時間了,所以我在想能不能read1和read2 同時跑上,這就可以節省一半的時間了。
平時也能遇到很多類似的任務,特別是在進程數有限的情況下,如果這些小任務單獨佔用一個進程,而任務很多就很耗時間,如果能在一個進程下實現多個線程並行執行,就能大大提高運行效率。關於進程和線程的知識可以參考知乎的這篇文章【 Shell「 多線程」,提高工作效率 】,整理的也比較有條理,能比較容易讀懂。
當然,某些博主也寫過類似的文章,例如這篇【 shell後台限制多並發控制後台任務強度進行文件拷貝 】但是實在是太高深莫測了,看不懂,一時半會兒也學不會。本文將示例Shell實現多線程的簡單版本,其實不用太復雜。
其實只需要兩個步驟, 第一步是給需要並行運行的命令行在結尾加上"&",代表放到後台運行,第二步是在在所有並行任務的後面加上一句「wait」,意思是等所有通過「&」放到後台運行的任務跑完後再繼續執行後面的任務 ,這些就能實現所有帶有「&」的行並行執行了。
看完腳本是不是覺得很簡單?
上面的腳本適合並行任務少的,可以手動加&和wait,但是如果有幾十個甚至上百個的小任務就比較麻煩了。但不用擔心,可以寫個循環,批量運行。
循環的結果也是跟上面類似的,只是多了個循環結構。
如果需要執行的任務只有一行,可以把大括弧去掉。
關於for和while的循環可以查看之前的文章【 Shell常用循環示例(for和while批量處理)2022-05-25 】
需要注意的是多線程並行還是需要有限制的,畢竟都是在一個進程里運行,如果線程太多了會卡頓的,建議控制在100個以內,當然還有畢竟高級和復雜的方法可以實現限制。因為上面的腳本已經夠我用了,沒繼續往下學,以後可以再補充。
『玖』 Linux 腳本編寫 如何編寫一個腳本,修改已有文件中的內容
實現的方法如下:
1、第一步,打開命令控制台以找到要編輯的文件,執行命令ls來查看下面的一些文件,在下面有一個index.php文件,如下圖所示。