1、cpu親緣性綁定
就是將進程綁定在固定的cpu上,提高cpu緩存命中率劫灶。
[root@node1 vusers.d]#ps axo psr,comm,pid #可以查看進程運行在哪顆cpu上
[root@node1 vusers.d]#taskset -p -c 0 2857 #將進程編號為2857的進程綁定到0號cpu上
pid 2857's current affinity list: 0-3
pid 2857's new affinity list: 0
[root@node1 vusers.d]#ps axo psr,comm,pid |grep 2857 #發(fā)現(xiàn)此進程只綁定在0號cpu上了
0 sshd 2857
2、修改進程的nice優(yōu)先級
[root@node1 vusers.d]#ps axo pid,cmd,nice #查看進程的nice優(yōu)先級
[root@node1 vusers.d]#renice -n -10 10972 #修改進程的優(yōu)先級
10972 (process ID) old priority 0, new priority -10
[root@node1 vusers.d]#ps axo pid,cmd,nice |grep 10972
10972 /usr/sbin/vsftpd /etc/vsftp -10
nice -n -10 vim f1 指定優(yōu)先級打開某個程序
3掖桦、隔離cpu和中斷
cpu不僅要運行進程還要處理中斷本昏,如果一個進程運行的cpu處理中斷的次數(shù)過多,勢必會影響進程的運行枪汪,為了不影響進程涌穆,可以將cpu進行隔離,比如有4核cpu雀久,可以隔離出2核cpu蒲犬,并和進程進行綁定用于專門運行進程,剩下的兩核處理中斷岸啡,這樣運行進程的cpu就不會處理中斷,提高進程的運行效率
①如何進行cpu隔離
centos6中:vim /etc/grub.conf
在kerner最后加上isolcpus=cpu編號0,1,2,3等赫编,隔離哪顆cpu巡蘸,就寫上哪顆cpu的編號
centos7中:vim /etc/grub2.cfg
在linux16 /vmlinuz-3.10.0-514.el7.x86_64最后加上isolcpus=cpu編號0,1,2,3等
②如何隔離中斷
[root@node1 vusers.d]#cat /proc/interrupts #可以查看每個cpu處理中斷的次數(shù),比如0號中斷擂送,0號cpu處理了20次
CPU0 CPU1 CPU2 CPU3
0: 20 0 0 0 IO-APIC-edge timer
1: 12 0 0 0 IO-APIC-edge i8042
8: 1 0 0 0 IO-APIC-edge rtc0
9: 0 0 0 0 IO-APIC-fasteoi acpi
12: 16 0 0 0 IO-APIC-edge i8042
14: 0 0 0 0 IO-APIC-edge ata_piix
15: 150 0 0 39853 IO-APIC-edge ata_piix
16: 305 0 0 0 IO-APIC-fasteoi vmwgfx, snd_ens1371
17: 9412 0 6435 0 IO-APIC-fasteoi ehci_hcd:usb1, ioc0
18: 204 0 0 0 IO-APIC-fasteoi uhci_hcd:usb2
19: 65 0 0 1083401 IO-APIC-fasteoi ens33, ens37
如何將所有的中斷都綁定到0,1號cpu上悦荒,這里的cpu編號應該是isolcpus中定義的cpu集合之外的其他cpu,也就是被隔離的cpu運行進程嘹吨,其他的cpu用于處理中斷
[root@node1 0]#cd /proc/irq/1/
[root@node1 1]#ls
affinity_hint i8042 node smp_affinity smp_affinity_list spurious
[root@node1 1]#cat smp_affinity
00000000,00000000,00000000,00000004
[root@node1 1]#echo 1 >smp_affinity
[root@node1 1]#cat smp_affinity
00000000,00000000,00000000,00000001
此項一般也不進行設定搬味,知道就可以。
4蟀拷、內存優(yōu)化
- 內存的過量使用
echo 1 > /proc/sys/vm/overcommit_memory #用于設定是否可以過量使用內存
0:是默認值碰纬,內核執(zhí)行啟發(fā)式內存過量使用處理,方法是估算可用內存量问芬,并且拒絕明顯無效的請求悦析,遺憾的是因為內存是使用啟發(fā)式而非準確算法計算進行部署,這個設置有時可能會造成系統(tǒng)中的可用內存超載此衅,相當于自動模式
1:內核執(zhí)行無內存過量使用處理强戴,也就是不能使用swap交換內存亭螟,比如實際使用的物理內存是64G,那么允許使用的內存就不能超過64G骑歹,如果用著用著內存超過了64G预烙,又不允許使用交互內存,就會造成內存被耗盡道媚。
2:表示運行內存過量使用扁掸,也就是可以使用swap交換內存,但要配合overcommit_ratio使用衰琐,可用的物理內存=swap+ramovercommit_ratio也糊,overcommit_ratio是一個比例,比如swap=4G羡宙,
ram=2G狸剃,overcommit_ratio=0.5,可用的物理內存=4+20.5=5G,但如果ram值很大狗热,比如服務器的ram=64G钞馁,此時overcommit_ratio就要設置的大一點,比如0.9或者0.95匿刮,這樣可用的內存=4+64*0.9=61.6G
這樣ram的物理內存就不會被耗盡僧凰,因為使用了57.6之后就會使用交換內存,當然我們有的時候為了調優(yōu)的目的熟丸,會把這個值設置為1训措,這樣就會最大限度的利用ram物理內存,直到內存被耗盡為止 - 設置超大內存頁數(shù)
[root@node1 vm]#cat /proc/sys/vm/nr_hugepages #規(guī)定在內核中配置的超大頁數(shù)光羞,默認值為0绩鸣,只有系統(tǒng)中有足夠的連續(xù)可用頁時放可分配
0
如果要啟動直接echo一個正整數(shù)即可
以上操作要想永久保存可以寫到配置文件/etc/sysctl.conf
[root@node1 vm]#sysctl --help
使用sysctl -p可以讓配置文件生效
[root@node1 vm]#cat /proc/meminfo #可以查看是否配置超大內存頁
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
[root@node1 vm]#echo 10 > /proc/sys/vm/nr_hugepages
[root@node1 vm]#cat /proc/meminfo
HugePages_Total: 10 #發(fā)現(xiàn)設置了10個超大內存頁
HugePages_Free: 10
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB #每個內存頁的大小為2048KB
- 與容量相關的內容可調參數(shù)
在/proc/sys/kernel目錄中
用于設置進程間通訊時占用內存的大小,進程間相互通訊時靠消息隊列中的消息進行通訊纱兑,如果a進程要和b進程通訊呀闻,就發(fā)一個消息,然后將這個消息放到消息隊列中排隊潜慎,輪到這個消息了就發(fā)給b進程捡多,兩個進程通訊時在內存中有很多個消息隊列。發(fā)送的消息時會放在隨機的一個消息隊列中
msgmax:單個消息的最大值铐炫,默認值為65536個字節(jié)
msgmnb:單個消息隊列的最大值垒手,默認值也是65536個字節(jié),如果單個消息的大小占65536個字節(jié)倒信,那么這個消息隊列中只能放一個消息了
msgmni:規(guī)定消息隊列的最大數(shù)量淫奔,64位架構機器默認值為1985,32位架構機器默認值為1736
msgmnbmsgmni就是內存中的消息隊列所占的內存空間有多大
shmall:規(guī)定共享內存片段一片最大能有多大,共享內存由一個個共享內存片段組成堤结,此值規(guī)定的就是每個共享內存片段的大小唆迁,64位架構機器的默認值為4294967296個字節(jié)鸭丛;32位架構的機器默認值為268435456字節(jié)
shmmax:以字節(jié)為單位規(guī)定內核可允許的最大共享內存,64位系統(tǒng)默認為68719476736,32位系統(tǒng)默認為4294967295唐责,注:內核支持的值比這個值要多的多
shmmni:規(guī)定系統(tǒng)最大共享內存片段有多少個鳞溉,64和32位系統(tǒng)默認都是4096個
shmmax=shmallshmmni
threads-max:規(guī)定一次內核使用的最大線程數(shù),發(fā)起進程請求時需要創(chuàng)建線程鼠哥,這個值就是規(guī)定能夠創(chuàng)建多少個線程熟菲,最小值為20 - 與容量相關的文件系統(tǒng)可調參數(shù)
位于/proc/sys/fs目錄中
aio-max-nr:規(guī)定異步I/0模式允許的最多事件數(shù),默認值為65536朴恳,一般用于nginx等支持異步I/O模式的服務抄罕,這個值已經(jīng)夠大了,一般不需要調整
file-max:內核分配的文件數(shù)的最大值于颖,默認為1024個呆贿,一般不需要修改
上面兩個參數(shù),每調大一個就意味著物理內存空間會被占用一些森渐,這就需要有足夠大的物理內存空間 - Out-of-Memory Kill可調參數(shù)
在/proc/pid/oom_adj目錄下 pid代表進程編號
定義-16到15之間的一個數(shù)值以便幫助決定某個進程的oom_score做入,oom_score的值越高,當內存被耗盡時就優(yōu)先被oom_killer殺死同衣,將oom_adj的值設置為-17則表示這個進行刀槍不入竟块,不能被oom_killer殺死,為了避免內存耗盡時某個進程被殺死耐齐,可以將此值設置為-17浪秘,但要先利用腳本獲取某個進程的進程編號才能修改 - 調整虛擬內存
swappiness:參數(shù)值為0-100,調整系統(tǒng)使用交換內存傾向性的設置埠况,數(shù)值越高秫逝,越優(yōu)先使用交換內存,默認為60询枚,如果要想讓系統(tǒng)盡量不使用交換內存,可以將overcommit_memory設置為1浙巫,也就是不允許過量使用內存金蜀,不能使用swap交換內存,然后將swappiness設置為0的畴,默認值為60比較大渊抄,為了調優(yōu),要把此值設置的小一點丧裁,要讓系統(tǒng)盡量不使用交換內存护桦,以提升性能。
[root@centos6 1345]#cat /proc/sys/vm/swappiness
60
min_free_kbytes:設置系統(tǒng)剩余可用物理內存為多少時才開始使用交換內存煎娇,單位為KB二庵,一般不需要調整
[root@centos6 1345]#cat /proc/sys/vm/swappiness
60
dirty_ratio:規(guī)定百分比值贪染,當臟數(shù)據(jù)的大小達到系統(tǒng)內存總大小的這個百分比值后開始把臟數(shù)據(jù)同步到磁盤,我們在更改一個文本時催享,先把這個文本讀到內存中杭隙,在內存中更改,臟數(shù)據(jù)指的是在內存中修改完還沒有來得急同步到磁盤上的數(shù)據(jù)因妙,當臟數(shù)據(jù)的大小達到規(guī)定的百分比時開始往磁盤上寫臟數(shù)據(jù)痰憎,默認為20,這個值不應該設置的過大攀涵,如果服務器掛了铣耘,就會有很多在內存中的數(shù)據(jù)還沒有同步到磁盤上,造成數(shù)據(jù)丟失以故,如果值過小又會造成頻繁的寫操作蜗细,增加磁盤IO,影響系統(tǒng)性能
[root@centos6 1345]#cat /proc/sys/vm/dirty_ratio #默認值較小据德,可以改為40
20
dirty_background_ratio:也是規(guī)定百分比鳄乏,根上面不同的是,dirty_ratio是單個進程臟數(shù)據(jù)大小占總內存大小的百分比達到多少時開始寫臟數(shù)據(jù)到磁盤棘利,而dirty_background_ratio是所有進程的臟數(shù)據(jù)大小占總內存大小的百分比達到多少時開始寫臟數(shù)據(jù)到磁盤橱野,默認為10
drop_caches:表示釋放內存的緩存,值有以下三個
1:系統(tǒng)釋放所有頁緩沖內存善玫,頁緩存是緩存文件的數(shù)據(jù)
2:系統(tǒng)釋放所有未使用的slab緩沖內存水援,slab是緩存文件的元數(shù)據(jù)
3:系統(tǒng)釋放所有頁緩沖和slab緩沖內存
[root@centos6 1345]#free -m
total used free shared buffers cached
Mem: 980 910 69 2 65 494
-/+ buffers/cache: 350 630
Swap: 2047 0 2047
[root@centos6 1345]#echo 1 > /proc/sys/vm/drop_caches
[root@centos6 1345]#free -m #發(fā)現(xiàn)緩存已經(jīng)變成53了
total used free shared buffers cached
Mem: 980 396 583 2 0 53
-/+ buffers/cache: 343 637
Swap: 2047 0 2047
不建議在生成環(huán)境中使用drop_caches釋放緩存
5、磁盤I/O性能優(yōu)化
磁盤器中的調度算法
CFQ:完全公平隊列茅郎,盡可能保證將可用I/O能力公平的分配給需要用到IO請求的進程
Deadline:每一個IO請求都有一個最后期限蜗元,在這個最后期限內IO請求必須被完成,使每個IO請求都不能被餓死
Anticipatory:就是在每一次IO操作時磁頭會在那個磁道和扇區(qū)停留一會系冗,看有沒有其他IO請求也要寫到這個區(qū)域的奕扣,就正好順道寫上,但實際上這種調度算法并不會提高多少IO性能掌敬,這種算法在較新的版本中在內核中已經(jīng)被移除了
Noop:不做調度惯豆,先進行的請求先進行寫磁盤操作
每個磁盤都有一個調度器
[root@node1 devices]#find /sys/devices/ -iname scheduler
/sys/devices/pci0000:00/0000:00:07.1/ata2/host2/target2:0:0/2:0:0:0/block/sr0/queue/scheduler
/sys/devices/pci0000:00/0000:00:10.0/host0/target0:0:0/0:0:0:0/block/sda/queue/scheduler
/sys/devices/pci0000:00/0000:00:10.0/host0/target0:0:1/0:0:1:0/block/sdb/queue/scheduler
/sys/devices/pci0000:00/0000:00:10.0/host0/target0:0:2/0:0:2:0/block/sdc/queue/scheduler
/sys/devices/pci0000:00/0000:00:10.0/host0/target0:0:3/0:0:3:0/block/sdd/queue/scheduler #在這些目錄下的scheduler文件中定義了當前正在使用的磁盤調度器
[root@centos6 1345]#cat /sys/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda/queue/scheduler #centos6中默認是cfq調度算法
noop anticipatory deadline [cfq]
[root@node1 devices]#cat /sys/devices/pci0000:00/0000:00:10.0/host0/target0:0:1/0:0:1:0/block/sdb/queue/scheduler #centos7中默認是deadline調度算法
noop [deadline] cfq
[root@centos6 1345]#echo deadline > /sys/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda/queue/scheduler #修改磁盤調度器的調度算法
[root@centos6 1345]#cat /sys/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda/queue/scheduler
noop anticipatory [deadline] cfq
一般情況下不需要修改調度算法,因為即使修改了也提高不了多少IO性能奔害,還不如使用固態(tài)硬盤提高的性能大楷兽。
6、文件系統(tǒng)
1华临、在執(zhí)行mkfs創(chuàng)建文件系統(tǒng)時指明塊大小芯杀,根據(jù)存儲文件的的大小進行設定,如果存儲的都是小文件,就使用小塊揭厚,如果存儲的文件比較大就使用大塊
2却特、外部日志:將日志放在專用的外部存儲中,但要確保外部日志是可靠的棋弥,不然丟失外部日志文件都可能造成文件系統(tǒng)的四級核偿,外部日志在運行mkfs創(chuàng)建文件系統(tǒng),并要掛載時指定日志設備
3顽染、掛載選項:
Barriers:Barriers可以保證數(shù)據(jù)的可靠性漾岳,啟用Barriers會顯著延緩一些程序的寫入性能,可使用nobarrier掛載選項禁用barrier粉寞,但禁用后可能會造成一些數(shù)據(jù)丟失尼荆,對于可以容忍斷電后承受數(shù)據(jù)丟失的場景可以使用此掛載選項
noatime:掛載時使用noatime掛載選項,如果不需要準確的atime唧垦,還可以啟用nodiratime捅儒,表示不更新目錄的訪問時間戳,但對文件是無效的振亮,noatime對文件和目錄都有效巧还,設定了noatime就不用設定nodiratime了
ext4文件系統(tǒng)
init_itable=n掛載選項可以控制發(fā)生初始化的比例,其中執(zhí)行這個后臺初始化的時間約為1/n坊秸,n的默認值為10
anto-fsync行為麸祷,ext4默認自動同步文件,可以使用mount -o noauto_da_alloc選項禁用它褒搔,這意味著該程序必須明確使用fsync()以保證數(shù)據(jù)一致
XFS文件系統(tǒng)
一般不需要調整阶牍,基本上都是最優(yōu)的
6、網(wǎng)絡優(yōu)化
計算核心緩沖的大小total buffers=帶寬*網(wǎng)絡延遲
[root@node1 devices]#ping 172.18.0.1
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=1.97 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=1.02 ms
64 bytes from 172.18.0.1: icmp_seq=3 ttl=64 time=1.07 ms
64 bytes from 172.18.0.1: icmp_seq=4 ttl=64 time=1.36 ms
^C
--- 172.18.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.020/1.360/1.979/0.382 ms #avg就是平均的網(wǎng)絡延遲
對于千兆以太網(wǎng)
帶寬=1000Mb/S
1000*1024*1024b/s
total buffers=1000*1024*1024b/s*1.36*10^-3s=1.42Mb=186122字節(jié)
根據(jù)這個值設置以下各項
vim /etc/sysctl.conf
net.core.rmem_default #核心接收緩沖的默認值
net.core.rmem_max #核心接收緩沖的最大值
net.core.wmem_default #核心發(fā)送緩沖的默認值
net.core.wmem_max #核心發(fā)送緩沖的最大值
sysctl -p
[root@node1 devices]#sysctl -a |grep net.core #可以查看默認值
net.core.rmem_default = 212992 #單位是字節(jié)星瘾,可以修改為上面的186122
net.core.rmem_max = 212992
net.core.wmem_default = 212992
net.core.wmem_max = 212992
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_mem #tcp協(xié)議的內存空間大小
21813 29084 43626 #有三個值走孽,min default max
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_rmem #tcp協(xié)議的接收緩沖大小
4096 87380 6291456
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_wmem #tcp協(xié)議的發(fā)送緩沖大小
4096 16384 4194304
內存在接收數(shù)據(jù)時先放到內存的接收緩沖區(qū),再放到內存琳状,發(fā)送數(shù)據(jù)時先放到內存的發(fā)送緩沖區(qū)磕瓷,再發(fā)送出去
在使用nginx等web服務時經(jīng)常需要調整的內核參數(shù)
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_tw_reuse #允許重用TCP的TIME-WAIT狀態(tài)重用
0
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_syncookies #啟用
syncookies可以在一定程度上保護syn flood攻擊,也就是有大量客戶端syn請求被涌入時
1
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_max_orphans #在內核中允許的最大孤兒進程念逞,孤兒進程指的是內核打開了tcp套接字
困食,但沒有任務一個文件描述符關聯(lián)到此套接字上,這種就稱為孤兒進
程肮柜,這個值一般只能調大,比如在受到ddos攻擊時會打開大量的套接
字倒彰,但來不及創(chuàng)建文件
4096
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_fin_timeout
60
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_max_tw_buckets #內核所能允許的tcp的time-wait狀態(tài)套接字的數(shù)量
4096
[root@node1 devices]#cat /proc/sys/net/core/somaxconn
128