一.硬件優(yōu)化
網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),成都做網(wǎng)站公司-創(chuàng)新互聯(lián)已向上千家企業(yè)提供了,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)絡(luò)營(yíng)銷等服務(wù)!設(shè)計(jì)與技術(shù)結(jié)合,多年網(wǎng)站推廣經(jīng)驗(yàn),合理的價(jià)格為您打造企業(yè)品質(zhì)網(wǎng)站。
系統(tǒng)運(yùn)行的速度是由系統(tǒng)中最慢的設(shè)備來決定。
選擇固態(tài)硬盤:
TLC SLC(最好)MLC
優(yōu)化的時(shí)候,優(yōu)化離cpu最近的設(shè)備
CPU --> CACHE
主頻:倍頻 * FSB
CACHE: 高速緩沖器,提高應(yīng)用程序的命中率.L1(數(shù)據(jù)區(qū),指令區(qū))獨(dú)立->L2 獨(dú)立->L3 共享
優(yōu)化思路:想方設(shè)法讓應(yīng)用數(shù)據(jù)停留在cache中更長(zhǎng)的時(shí)間。
應(yīng)用運(yùn)行過程:
DISK --> MEM --> cache --> CPU
DISK:優(yōu)化IO算法
SSD: SATA3 --> PCIe --> NVMe
二.系統(tǒng)層面
1.常用命令
(1).ps
自定義顯示進(jìn)程列
# ps axo pid,comm,pcpu
(2).vmstat
# vmstat 1 2 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 148 284184 212 663928 0 0 12 5 81 121 0 0 99 0 0 0 0 148 284060 212 663928 0 0 0 0 96 126 0 0 100 0 0 r 表示運(yùn)行隊(duì)列(就是說多少個(gè)進(jìn)程真的分配到CPU),我測(cè)試的服務(wù)器目前CPU比較空閑,沒什么程序在跑,當(dāng)這個(gè)值超過了CPU數(shù)目,就會(huì)出現(xiàn)CPU瓶頸了。這個(gè)也和top的負(fù)載有關(guān)系,一般負(fù)載超過了3就比較高,超過了5就高,超過了10就不正常了,服務(wù)器的狀態(tài)很危險(xiǎn)。top的負(fù)載類似每秒的運(yùn)行隊(duì)列。如果運(yùn)行隊(duì)列過大,表示你的CPU很繁忙,一般會(huì)造成CPU使用率很高。 b 表示阻塞的進(jìn)程,這個(gè)不多說,進(jìn)程阻塞,大家懂的。 swpd 虛擬內(nèi)存已使用的大小,如果大于0,表示你的機(jī)器物理內(nèi)存不足了,如果不是程序內(nèi)存泄露的原因,那么你該升級(jí)內(nèi)存了或者把耗內(nèi)存的任務(wù)遷移到其他機(jī)器。 free 空閑的物理內(nèi)存的大小,我的機(jī)器內(nèi)存總共8G,剩余3415M。 buff Linux/Unix系統(tǒng)是用來存儲(chǔ),目錄里面有什么內(nèi)容,權(quán)限等的緩存,我本機(jī)大概占用300多M cache cache直接用來記憶我們打開的文件,給文件做緩沖,我本機(jī)大概占用300多M(這里是Linux/Unix的聰明之處,把空閑的物理內(nèi)存的一部分拿來做文件和目錄的緩存,是為了提高 程序執(zhí)行的性能,當(dāng)程序使用內(nèi)存時(shí),buffer/cached會(huì)很快地被使用。) si 每秒從磁盤讀入虛擬內(nèi)存的大小,如果這個(gè)值大于0,表示物理內(nèi)存不夠用或者內(nèi)存泄露了,要查找耗內(nèi)存進(jìn)程解決掉。我的機(jī)器內(nèi)存充裕,一切正常。 so 每秒虛擬內(nèi)存寫入磁盤的大小,如果這個(gè)值大于0,同上。 bi 塊設(shè)備每秒接收的塊數(shù)量,這里的塊設(shè)備是指系統(tǒng)上所有的磁盤和其他塊設(shè)備,默認(rèn)塊大小是1024byte,我本機(jī)上沒什么IO操作,所以一直是0,但是我曾在處理拷貝大量數(shù)據(jù)(2-3T)的機(jī)器上看過可以達(dá)到140000/s,磁盤寫入速度差不多140M每秒 bo 塊設(shè)備每秒發(fā)送的塊數(shù)量,例如我們讀取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO過于頻繁,需要調(diào)整。 in 每秒CPU的中斷次數(shù),包括時(shí)間中斷 cs 每秒上下文切換次數(shù),例如我們調(diào)用系統(tǒng)函數(shù),就要進(jìn)行上下文切換,線程的切換,也要進(jìn)程上下文切換,這個(gè)值要越小越好,太大了,要考慮調(diào)低線程或者進(jìn)程的數(shù)目,例如在apache和nginx這種web服務(wù)器中,我們一般做性能測(cè)試時(shí)會(huì)進(jìn)行幾千并發(fā)甚至幾萬并發(fā)的測(cè)試,選擇web服務(wù)器的進(jìn)程可以由進(jìn)程或者線程的峰值一直下調(diào),壓測(cè),直到cs到一個(gè)比較小的值,這個(gè)進(jìn)程和線程數(shù)就是比較合適的值了。系統(tǒng)調(diào)用也是,每次調(diào)用系統(tǒng)函數(shù),我們的代碼就會(huì)進(jìn)入內(nèi)核空間,導(dǎo)致上下文切換,這個(gè)是很耗資源,也要盡量避免頻繁調(diào)用系統(tǒng)函數(shù)。上下文切換次數(shù)過多表示你的CPU大部分浪費(fèi)在上下文切換,導(dǎo)致CPU干正經(jīng)事的時(shí)間少了,CPU沒有充分利用,是不可取的。 us 用戶CPU時(shí)間,我曾經(jīng)在一個(gè)做加密解密很頻繁的服務(wù)器上,可以看到us接近100,r運(yùn)行隊(duì)列達(dá)到80(機(jī)器在做壓力測(cè)試,性能表現(xiàn)不佳)。 sy 系統(tǒng)CPU時(shí)間,如果太高,表示系統(tǒng)調(diào)用時(shí)間長(zhǎng),例如是IO操作頻繁。 id 空閑 CPU時(shí)間,一般來說,id + us + sy = 100,一般我認(rèn)為id是空閑CPU使用率,us是用戶CPU使用率,sy是系統(tǒng)CPU使用率。 wt 等待IO CPU時(shí)間。
(3).iostat
# iostat Linux 3.10.0-693.el7.x86_64 (rh2) 08/02/2018 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.20 0.01 0.32 0.01 0.00 99.46 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.87 12.23 5.24 898971 385228 scd0 0.00 0.01 0.00 1054 0 dm-0 0.86 11.76 5.21 864302 383008 dm-1 0.00 0.03 0.00 2228 152
avg-cpu:
選項(xiàng) | 說明 |
---|---|
%user | CPU在用戶態(tài)執(zhí)行進(jìn)程的時(shí)間百分比。 |
%nice | CPU在用戶態(tài)模式下,用于nice操作,所占用CPU總時(shí)間的百分比 |
%system | CPU處在內(nèi)核態(tài)執(zhí)行進(jìn)程的時(shí)間百分比 |
%iowait | CPU用于等待I/O操作占用CPU總時(shí)間的百分比 |
%steal | 管理程序(hypervisor)為另一個(gè)虛擬進(jìn)程提供服務(wù)而等待虛擬CPU的百分比 |
%idle | CPU空閑時(shí)間百分比 |
Device:
選項(xiàng) | 說明 |
---|---|
Device | 設(shè)備名稱 |
tps | 每秒向磁盤設(shè)備請(qǐng)求數(shù)據(jù)的次數(shù),包括讀、寫請(qǐng)求,為rtps與wtps的和。出于效率考慮,每一次IO下發(fā)后并不是立即處理請(qǐng)求,而是將請(qǐng)求合并(merge),這里tps指請(qǐng)求合并后的請(qǐng)求計(jì)數(shù)。 |
Blk_read/s | Indicate the amount of data read from the device expressed in a number of blocks per second. Blocks are equivalent to sectors with kernels 2.4 and later and therefore have a size of 512 bytes. With older kernels, a block is of indeterminate size. |
Blk_wrtn/s | Indicate the amount of data written to the device expressed in a number of blocks per second. |
Blk_read | 取樣時(shí)間間隔內(nèi)讀扇區(qū)總數(shù)量 |
Blk_wrtn | 取樣時(shí)間間隔內(nèi)寫扇區(qū)總數(shù)量 |
# iostat -x Linux 3.10.0-693.el7.x86_64 (rh2) 08/02/2018 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.20 0.01 0.32 0.01 0.00 99.46 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.02 0.24 0.63 12.23 5.24 40.10 0.00 0.88 1.18 0.77 0.31 0.03 scd0 0.00 0.00 0.00 0.00 0.01 0.00 68.00 0.00 0.35 0.35 0.00 0.35 0.00 dm-0 0.00 0.00 0.21 0.64 11.75 5.21 39.57 0.00 0.94 1.33 0.80 0.31 0.03 dm-1 0.00 0.00 0.00 0.00 0.03 0.00 36.06 0.00 7.01 0.05 24.21 1.21 0.00
選項(xiàng) | 說明 |
---|---|
rrqm/s | 每秒對(duì)該設(shè)備的讀請(qǐng)求被合并次數(shù),文件系統(tǒng)會(huì)對(duì)讀取同塊(block)的請(qǐng)求進(jìn)行合并 |
wrqm/s | 每秒對(duì)該設(shè)備的寫請(qǐng)求被合并次數(shù) |
r/s | 每秒完成的讀次數(shù) |
w/s | 每秒完成的寫次數(shù) |
rkB/s | 每秒讀數(shù)據(jù)量(kB為單位) |
wkB/s | 每秒寫數(shù)據(jù)量(kB為單位) |
avgrq-sz | 平均每次IO操作的數(shù)據(jù)量(扇區(qū)數(shù)為單位) |
avgqu-sz | 平均等待處理的IO請(qǐng)求隊(duì)列長(zhǎng)度 |
await | 平均每次IO請(qǐng)求等待時(shí)間(包括等待時(shí)間和處理時(shí)間,毫秒為單位) |
svctm | 平均每次IO請(qǐng)求的處理時(shí)間(毫秒為單位) |
%util | 采用周期內(nèi)用于IO操作的時(shí)間比率,即IO隊(duì)列非空的時(shí)間比率 |
(4).mpstat
查看多核cpu ,可以顯示每個(gè)核心cpu的運(yùn)行情況。 vmstat 只能顯示總體的cpu
# mpstat -P ALL Linux 3.10.0-693.el7.x86_64 (rh2) 08/02/2018 _x86_64_ (1 CPU) 10:13:33 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 10:13:33 PM all 0.20 0.01 0.32 0.01 0.00 0.01 0.00 0.00 0.00 99.46 10:13:33 PM 0 0.20 0.01 0.32 0.01 0.00 0.01 0.00 0.00 0.00 99.46
(5).
# time ls
real 0m0.006s
user 0m0.000s
sys 0m0.005s
* 0.001s 為等待時(shí)間
(6).sar
sar 日志存儲(chǔ)目錄
cd /var/log/sa
# sar -f sa31 #默認(rèn)cpu # sar -f sa31 -b #查看磁盤 # sar -q -f sa31 #查看隊(duì)列 # sar -q -f sa31 |awk '{print $3}' |sort -unr #最大隊(duì)列的進(jìn)程號(hào) # sar -d -p -f sa31 |awk '{print $2,$4}' |grep ^sd |sort -unr #哪個(gè)設(shè)備的讀取速率最高 # sar -n DEV #查看網(wǎng)絡(luò)吞吐量 # sar -r 1 1 #內(nèi)存和swap使用情況
(7).dmidecode
查看詳細(xì)的硬件信息
(8).lspci,lscpu,lsusb,lsscsi,lsblk
查看各種硬件信息命令
(9).dmesg
- 記錄系統(tǒng)啟動(dòng)時(shí)候的硬件相關(guān)信息,啟動(dòng)后該日志文件不再更新
/var/log/dmesg
- 查看系統(tǒng)啟動(dòng)后加載的硬件信息,需要查看dmesg
2.sysctl
(1).sysctl -a #顯示當(dāng)前可調(diào)整的所有參數(shù)
(2).修改配置文件,調(diào)整參數(shù)
vim /etc/sysctl.conf 老版本
vim /etc/sysctl.d/10-sysctl.conf 新版本
(3).sysctl -p /etc/sysctl.d/10-sysctl.conf
使參數(shù)永久生效
3.swap
swap可以是文件也可以是磁盤分區(qū),最多可以有32個(gè),每個(gè)最大64G
性能考慮:
避免 swap 文件
將 swap 分區(qū)分速度快的介質(zhì)上
多個(gè)小的 swap 效果要比一個(gè)大的 swap 效果好 設(shè)置 swap 優(yōu)先級(jí)別
4.內(nèi)核IO調(diào)度器
-NooP Scheduler
適用于隨機(jī)訪問設(shè)備,如閃盤 FIFO ,基本合并與排序 適用于嵌入式操作系統(tǒng)
-Anticipatory I/O Scheduler
內(nèi)核默認(rèn)的調(diào)度器
不適用于數(shù)據(jù)吞吐量大的數(shù)據(jù)庫系統(tǒng)
-DeadLine Io調(diào)度器
提升 IO 性能的同時(shí)避免 IO等待
保證既定的IO請(qǐng)求最小的延遲時(shí)間
-CFQ I/O Schedulere
RHEL 默認(rèn)的調(diào)度器 IO請(qǐng)求輪詢進(jìn)行,為應(yīng)用平均分配帶寬,提供一個(gè)平等的工作環(huán)境
(1).臨時(shí)修改
[root@rh2 ~]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
[root@rh2 ~]# echo cfq>/sys/block/sda/queue/scheduler
[root@rh2 ~]# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
(2).修改所有的配置
修改 grub.conf #boot=/dev/hda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Red Hat Enterprise Linux Server (2.6.18-8.el5) root (hd0,0) kernel /vmlinuz-2.6.18-8.el5 ro root=LABEL=/ rhgb quiet elevator=deadline initrd /initrd-2.6.18-8.el5.img
(3).tuned-adm
5.內(nèi)存優(yōu)化
相關(guān)參數(shù):
vm.dirty_expire_centisecs = 3000 #舊數(shù)據(jù)的回寫時(shí)間,30秒后臟頁要回寫到磁盤 vm.dirty_background_ratio = 10 #整個(gè)系統(tǒng)臟頁百分比超過10,則進(jìn)行刷臟頁 vm.dirty_ratio = 30 #整個(gè)臟頁達(dá)到內(nèi)存的30%時(shí),則進(jìn)行刷臟頁 vm.dirty_writeback_centisecs = 500 #刷新臟數(shù)據(jù)進(jìn)程的時(shí)間間隔 vm.swappiness=30 #使用內(nèi)存還是swap的傾向值
6.網(wǎng)絡(luò)優(yōu)化
BDP 帶寬延遲乘積
計(jì)算公式(字節(jié)) = 帶寬(MB)x 延時(shí) (s)x1024x1024/8
相關(guān)參數(shù):
net.ipv4.tcp_mem = 194976 259968 389952 net.ipv4.tcp_wmem = 4096 16384 4194304 net.ipv4.tcp_rmem = 4096 87380 4194304 net.ipv4.udp_mem = 194976 259968 389952 net.core.wmem_max = 131071 net.core.rmem_max = 131071 net.core.wmem_default = 110592 net.core.rmem_default = 110592