一、基本概念
QPS:query per second, 1秒內完成的請求數
RT:response time, 1個請求完成的時間
Throughput越大,Latency會越差。因為請求量過大,系統太繁忙,所以響應速度自然會低
Latency越好,能支持的Throughput就會越高。因為Latency短說明處理速度快,於是就可以處理更多的請求
最佳線程數量=((線程等待時間+線程cpu時間)/線程cpu時間) * cpu數量
線程過多,時間消耗長,並不是說代碼執行效率下降了,而是資源的競爭,導致線程等待的時間上升了,線程越多消耗內存越多,過多的線程直接將系統內存消耗殆盡
平均響應時間 = (並發線程數/最佳線程數) * 最佳線程數的響應時間
總QPS=線程數*單個線程的QPS
二、系統調優的目的
-
(1)調優的目的是高效地使用資源,盡可能地使用最多的資源,從而提高性能
-
(2)任何資源都要查看是資源使用率滿了,還是沒有高效使用資源
例如CPU使用率高,是因為算法問題(死循環,低效算法),還是因為程序本身就需要這么多CPU。如果CPU使用率低,則查看是因為資源等待還是線性操作。
又如I/O,wa低下,也有可能I/O的問題(當然不是硬件問題),wa低下代表磁盤的使用率低下。這時要看到底是程序本身不怎么使用磁盤,還是沒有高效使用(大量隨機操作,而不是批量操作,順序寫入,使用緩沖等) -
(3)如果要提升服務器端的響應時間RT
采用減少IO的時間能達到最佳效果,比如合並多個IO請求
減少IO的調用次數:並發HTTP請求(無上下文依賴,多個連接,一個線程)、HTTP連接池(長連接)
減少CPU的使用時間
使用緩存 -
(4)如果要提升QPS
采用優化CPU的時間能達到最佳效果,同時可以加大線程數
減少CPU的使用時間
增加CPU的數量
減少同步鎖
如果CPU不能被壓到85%以上,並且此時的QPS已經達到了峰值,則說明另有瓶頸
三、影響性能的因素
想確定有哪些因素,首先確定你的應用是什么類型的?
例如:
1.cpu密集型
例如web服務器像nginx node.js需要CPU進行批處理和數學計算都屬於此類型
- io密集型
例如數據庫常見的mysql,大量消耗內存和存儲系統,對CPU和網絡要求不高,這種應用使用CPU來發起IO請求,然后進入sleep狀態。
-
確定了應用類型就開始分析有哪些情況能影響性能:
大量的網頁請求會填滿運行隊列、大量的上下文切換,中斷
大量的磁盤些請求
網卡大量的吞吐
以及內存耗盡等。。 -
歸結起來就是4個方面
cpu
memory
i/o
network
-常用的性能分析工具
htop vmstat iotop sar strace iftop ss lsof ethtool mtr等
四、常見的內核參數優化
cat >>/etc/sysctl.conf<<EOF
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
#以下參數是對iptables防火牆的優化,防火牆不開會提示,可以忽略不理。
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
EOF
sysctl –p <<-配置完成后查看
禁止Linux被ping會增加系統安全:echo "net.ipv4.icmp_echo_ignore_all=1">>/etc/sysctl.conf
使其生效:sysctl -p
五、更改SSH服務端遠程配置
修改默認文件路徑
vim /etc/ssh/sshd_config
修改的參數
port #端口
PermitEmptyPasswords #是否允許密碼為空的用戶遠程登錄
PermitRootLogin #是否允許root登錄
UseDNS #指定sshd是否應該對遠程主機名進行反向解析,以檢查主機名是否與其IP地址真實對應。默認yes.建議改成no ,否則可能會導致SSH連接很慢。
GSSAPIAuthentication no #解決linux之間使用SSH遠程連接慢的問題
ListenAddress #監聽指定的IP地址
六、內存參數優化
另外讓系統管理大量內存有兩種方法:
(1)增加硬件內存管理單元中頁表數
(2)增大頁面大小
第一種方法不太現實,所有我們考慮第二種方法。即:大頁面。
32位系統4m大頁框64位系統2m大頁框,頁框越粗浪費越嚴重。
查看系統的大頁面:
cat /proc/meminfo
AnonHugePages: 309248 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 6144 kB
DirectMap2M: 1042432 kB
DirectMap1G: 0 kB
AnonHugePages:透明大頁面,THP是一個提取層,可自動創建、管理和使用超大頁面的大多數方面。
另外HP必須在引導時設置。
手動設置大頁面的頁數:
sysctl vm.nr_hugepages = 20
-
DMA:直接讀取內存
在實現DMA傳輸時,是由DMA控制器直接掌管總線,因此,存在着一個總線控制權轉移問題。即DMA傳輸前,CPU要把總線控制權交給DMA控制器,而在結束DMA傳輸后,DMA控制器應立即把總線控制權再交回給CPU。一個完整的DMA傳輸過程必須經過DMA請求、DMA響應、DMA傳輸、DMA結束4個步驟。 -
虛擬內存:
32位的系統上每一個進程在訪問內存的時候,每一個進程都當做自己有4個G的內存空間可用,這叫虛擬內存(地址),虛擬內存轉化成物理內存是通過MMU來完成的。生產中我們盡量不使用虛擬內存。 -
影響系統性能的幾個內存參數:
-
overcommit_memory 過量使用內存
0 默認設置系統決定是否過量使用。
1 不過量使用
2 過量使用但有一定的比例默認百分值五十由overcommit_ratio決定(他就是默認的50),舉個例子物理內存8g,swap4g,可以過量使用10g。
注:生產中盡量避免過量使用,例如redis要關閉過量使用。 -
spappines
將不活躍的進程換進swap。注:盡量不去使用swap。
生產中設置:
echp 10 > /proc/sys/vm/swappines -
回收內存
這個值設定為 1、2 或者 3 讓內核放棄各種頁緩存和 slab 緩存的各種組合。
1 系統無效並釋放所有頁緩沖內存即buffers
2 系統釋放所有未使用的 slab 緩沖內存。即cached
3 系統釋放所有頁緩沖和 slab 緩沖內存。
生產中使用:
1.運行sync
echo 3>/proc/sys/vm/drop_caches