服務器性能參數學習與總結

服務器性能參數學習與總結


總體說明

在不考慮奸商和回扣的的情況下:
同時間段購買的機器, 價錢越高,配置越高,機器的性能越好.
其實服務器與PC機器一樣, 高性能往往意味着高價格.
在購買成套的機器的情況下低價格想要有高性能幾乎不可能. 

但是不同服務器的側重點有所不同,需要進行考慮與選型.

計算機組成原理

現代馮諾依曼架構的服務器主要有如下五部分:
輸入設備, 輸出設備
計算器,控制器
存儲器

需要說明的是 廣義意義上的 輸入輸出設備 還包含像是硬盤這樣的設備. 

存儲器包含 CPU的一二三級緩存. 主存等部分.
所以性能提升至少要從三部分開始考慮:
CPU, 內存, 硬盤

第一部分 CPU


CPU性能

簡單來講:
CPU的性能可以根據場上以及型號進行簡單的判斷.
現在還的CPU廠商主要有:Intel AMD IBM 飛騰 鯤鵬 龍芯 海光 等. 
Intel 和 AMD 是最先進的x86架構處理器.

Intel最新的服務器CPU是至強可擴展第三代
分爲 銅牌, 銀牌, 金牌, 鉑金
型號一般爲 8358
第一位數字表示 級別. 
第二位數字表示 代數
第三四位數字表示  具體的SKU

CPU性能

image


CPU的性能

AMD的命令與Intel的CPU 有一些差異, 需要注意的是,現階段大部分在售都是Intel的服務器
AMD的服務器多見於雲服務廠商.

image


影響CPU性能的參數

上一節講解了CPU的代數與命名
但是並不是新一代的一定比舊一代的CPU性能好
也不是同一代裏面編號開頭大的一點比小開頭的性能好.
還有一些關鍵的核心參數(不限於):

CPU主頻和核數.
CPU高速緩存.
CPU的內存通道數,PCI-E等通道數.
CPU支持的內存頻率
其他:
流水線深度
超標量處理器的指令發射數.
指令的類型(RISC和CISC)
多級緩存的速度與包含模式.
TLB等訪存組件的大小以及性能.
寄存器的多少與容量.

影響CPU的性能參數

其他條件基本一致的情況下:
產品未涉及GPU計算等需求時:
主頻*核數 基本上決定了CPU的整體性能. 

建議使用這兩個數的乘積 再乘以 CPU的路數來計算最大的CPU計算性能.
需要注意:
CPU的路數越多 CPU之間的信息通信的損耗就越多, 並不能嚴格的線性增長.
可以作爲大體計算, 但是不能用於摸高驗證.

CPU的指令集其實是非常複雜的. 包括uos的一些類似於RISC的優化設置.以及很多類似於
AVX-512等CPU指令集, 其實是能在某些場景下很好的來提高產品的性能的.
還比如一些硬件加解密模塊,比如HTTPS使用的一些, 如果硬件實現,比軟件實現的效率高很多
這也就是爲什麼一些國產CPU在安全場景下比國外大廠的CPU性能要差一些的一些原因.

影響CPU的性能參數

CPU的流水線最近基本上趨於一致了. 一般都是 14-16級流水線.
流水線太低和太高都各有優缺點.
太低了不利於提高主頻, 太高了流水線之間的延遲佔用率會更多
兩者太極端都不利於提高性能.

現階段都是超標量的處理器, 通過指令decoder 多發射的方式來提高性能.
但是因爲指令之間需要有先後關係. 所以有時候超標量流水線需要停頓來保證數據準確.
所以CPU的極限速度並不是超標量的發射數的倍數關係. 

亂序執行 out of order execution.
與超標量對應的,CPU會decoder解析命令,然後將CISC的指令解析爲uos,便於調度和減少
佔用流水線的單元時間, 提高主頻. 
但是亂序可能會導致產品出現一些一致性的問題, 所以JAVA開發就會有volatile等參數
實現內存屏障避免數據被錯誤的併發修改.

影響CPU的性能參數

緩存容量以及TLB,寄存器等的數量和容量

因爲程序運行是有時間侷限性和空間侷限性.
所以可以使用較小容量的高速緩存來提高程序的性能. 

需要說明, CPU的時鐘週期以及遠遠大於內存的工作頻率,內存是無法餵飽CPU的.
一級緩存一般是2-4時鐘週期. 二級緩存 6-12 三級緩存 12-40
內存的話一般需要至少40-100的時鐘週期.

所以高速緩存能夠極大的提高性能. 
還需要注意的是 緩存命中率的關係. 命中率越高,性能越好. cache miss的話會有IO懲罰
性能會急劇降低. 

現在操作系統都是 段頁式內存管理. 
段式管理主要適用於不通內存的類型進行管理, 比如文本區,命令區,堆區,棧區,mmap映射區等.
頁式內存管理是用來提高訪存速度. 
爲了提高內存訪存效率,高級別的頁一般都緩存到CPU內部的TLB中, 他能夠決定訪問的很大一部分的性能.

寄存器如果太少, 在超線程或者是一些複雜指令時可能就無法有效的併發執行,會導致性能衰退.

影響CPU的性能參數

其他參數:
NUMA
功耗
睿頻
溫度以及散熱能力
操作系統的優化.

第二部分 內存相關


影響內存的性能參數

最重要的參數, 容量+帶寬(頻率*通道)
內存最重要的參數就是容量. 容量越大能夠存到內存裏的內容越多
訪問硬盤的次數就會越少性能越高. 

但是內存大小僅僅是內存的一個參數,還有一些其他很重要的參數

內存頻率也是一個比較重要的參數. 
需要注意的是內存的工作頻率一般只有 100Mhz 133Mhz 以及 166Mhz
因爲DRAM 有一個 預充電的動作,無法將工作頻率提高的更高.
想對應的 DRAM有一個等效頻率. 從最開始的DDR 400 到現在DDR3 2933
以及最高的DDR5 6400

需要注意的是內存的等效頻率一般可以通過 乘以8 來計算的對應的內存帶寬
比如DDR 400的內存帶寬就是3.2GB/s

CPU的計算能力其實可以根據上面CPU章節裏面的總Ghz數 簡單的乘以8bytes來計算
比如2路10核2.0Ghz的 帶寬就至少爲 2*10*2*8=320GB/s
當然這裏沒有考慮MIMD以及一些更高級別的指令. 

還需要注意的是通道數:
如果通道數都插滿的話 內存的帶寬*通道數 就是內存能夠提供的總體帶寬.

影響內存的性能參數

內存時延

上一節裏面簡單講了下 DRAM是需要預充電的
並且是需要有行列轉換以及尋址的, 所以其實內存是有較高的時延的
一般有四組數字來計算
但是需要注意的是 這四組數字是沒有跟工作頻率掛鉤,但是卻與等效頻率來掛鉤.
所以除去上一節內存的兩大參數. 最大的影響CPU的參數就是時延

CL-TRCD-TRP-TRAS 
一般情況下 同頻內存, 數字越低性能越好
不同頻無法直接比較, 需要進行換算.

影響內存的性能參數

其他方面
內存的條數,通道是否插滿
內存的體質.
內粗的品牌.
CPU的NUMA的內存分配.
操作系統和數據庫針對NUMA的綁定.
進程的綁定NUMA節點等.

CPU和內存的互相作用

CPU和內存是相輔相成的. 如果內存不夠, 會出現大量的SWAP換頁操作,導致CPU使用量上升.
表現爲: SYS內核CPU時間佔比升高, USER用戶態CPU時間佔用較低, 無法實現最佳業務性能.
內存的帶寬和吞吐量也會影響CPU的表現, 現階段服務器大部分都是多通道內存控制器的. 
如果內存僅插了一部分, 可能無法提供最佳CPU性能, 因爲CPU處於一個飢餓的狀態. 

內存的等效頻率也有較高的影響, 如果等效頻率低, 會導致CPU出現吞吐量的瓶頸. 
操作系統的設置中要根據機器的配置進行相關的處理, 要給操作系統留下足夠調度用的內存
應用或者是數據庫的內存配置一定要符合場景要求. 

如果內存佔用較多一方面會降低CPU的表現,也極容易出現OOM_KILLER的現象. 

第三部分 硬盤相關


影響硬盤的性能參數

關鍵參數: 時延+帶寬+IOPS

先說帶寬:
磁盤與內存一樣也是有帶寬的. 不同設備的帶寬也時不同的.
之前的磁盤有使用 IDE並行傳輸的設備. 但是因爲並行先之間的干擾太大
速度無法做到很過, 現在都是使用串行傳輸設備. 一般協議爲AHCI
AHCI指代 Advance Host control interface 
這個協議非常好的適配了 機械硬盤的特性. 他一般有兩種設備接口形式: 
比如SATA 或者是 SAS
SATA 可以理解爲平民版的串口設備
SAS 指代 serial attach scsi 設備. 屬於服務器使用的設備
最新的協議都是 3.0
其中SATA 3.0的協議最高帶寬是 6.0Gbps
SAS 3.0協議的最高帶寬是12.0Gbps

SATA 也可以用到服務器上面 一遍稱之爲 near-line 磁盤
但是轉速一般只有 7.2krpm SAS的磁盤可以做到15krpm轉速.性能要好很多. 
但是噪音和功耗都比較大

因爲NMVe的快速發展SAS已經不再發布新的版本, 都要遷移到NVMe協議上來

影響硬盤的性能參數

AHCI與NVMe協議的差異. --關於時延和開銷
本文只是簡單科普, 不進行內部詳細協議的分析, 感性來說協議的差異在用
AHCI協議時磁盤的轉速有線,尋址和傳輸都是以毫秒來技術. 所以AHCI的指令都是納秒級別.
就算是幾百上千個指令纔到微秒級別與磁盤相比依舊是九牛一毛, 所以AHCI的協議非常體貼的
關照了機械磁盤的一些特性,可以有電梯調度以及一些其他的算法. 時延佔比很低
但是隨着固態硬盤的發展, 因爲固態硬盤沒有機械狀態.
使用的都是NAND的晶體管存儲. 所以電子信號的相應速度也基本上打到了納秒或者是微秒級別
這個時候AHCI的微秒級別的指令響應時間就會佔據傳輸過程中的較大比率. 
因爲爲了適配NAND存儲介質的固態SSD硬盤 就有了 NVMe的存儲協議
他的協議可以有很深的隊列深度 (磁頭一個盤片就一個,深度太深沒有用處)
並且降低了指令的數量以及延遲時間,極大的提高了效率. 

AHCI天然適配 機械硬盤 NVMe適配固態硬盤.
AHCI一般都SATA或者是SAS接口的設備.
NMVe可以走u.2 後者是PCI-E適配.

需要注意 raid卡也是需要看清楚支持的接口類型, 有可能不支持NVMe的適配.

影響硬盤的性能參數

AHCI 使用SAS後者是SATA硬盤時, 如果選用較高的RAID卡以及高轉速的設備.
數據庫服務器的性能可能不會低於SATA的SSD的數據庫服務器.

原因主要如下:
1. 數據庫事務調都是順序寫的redo log來落盤的.DBWR後臺進程都是dirty buffer滿
或者是時間到了纔會批量刷盤. 這樣無疑降低了機械盤尋道時間以及延遲較高的缺點
redo log的寫入都是順序寫. 機械硬盤可以滿速寫入.將SAS3.0協議的帶寬打滿. 與之對應的
SSD在剩餘容量較小時因爲寫放大的原因和SAS協議的上限,並不能夠完整的提現SSD的高性能.
2. 雖然SSD的離散讀寫能力較強. 但是現在內存也很便宜. 高級數據庫一般內存量都足夠,能夠將
儘可能多的數據buffer到內存中去. 因此高併發時, 如果不是cache miss 會出現大量的物理讀盤
一般情況下的性能並沒有特別大的差異
3. raid卡的緩存介入以及raid算法將IO打散
raid卡能夠將磁盤性能儘可能的最大化. 磁盤越大性能越好, 越接近於SAS協議的上限. 

所以要是想提高數據庫的真正性能, 還是需要選用NVMe的固態硬盤,不然選擇SSD還不如高轉速的HDD
ssd 現在容量可以做的比高轉速的HDD要大很多, 但是斷電可能會丟數據,以及數據盤損壞和降速的
概率要高很多.

影響硬盤的性能參數

其實有了時延,也有了帶寬
IOPS有時候就可以算出來了.
如果是小塊的隨機IO讀寫
IOPS=1s/(尋道時延+傳輸時延)
如果是大塊的順序IO讀寫,會將帶寬打滿
IOPS=(帶寬/塊大小) (可能略低)

隨機IOPS對內存和CPU壓力大的數據庫系統有非常大的知道意義.
但是如果內存壓力不是很大. 很多時候會將壓力傳導到順寫寫上面.
畢竟寫入redo log 基本上就已經落盤了, 以爲宕機可以通過各種方式
恢復數據. 

影響硬盤的性能參數

NVMe以及傲騰相變存儲
NVMe 指代 non volatile memory exporess
之前一般使用PCI-E的構型, 現在有了U.2 的 2.5寸樣式以及E1.s和E1.l等存儲專用的
構型可以選擇.
基礎一般的存儲介質還是NAND的半導體存儲. 機制還是使用電容來表示0和1
但是還有一種高級別的存儲介質 也就是
傲騰相變內存存儲
這個是intel 的技術. 並且需要專用的intelCPU和操作系統驅動纔可以支持.
傲騰的存儲機理不是電子電容, 而是根據原子排列產生電阻和不產生電阻來實現
的相變存儲機制. 

傲騰相變內存的接口一般使用 DDR內存條的類型 
可以斷電不對視數據
他的延遲可以做到微秒一下 比內存稍微高不到一個數量級的 幾百納秒

但是因爲佔用了 CPU的內存控制器的帶寬, 所以會影響服務器的可用內存數量.
並且傲騰的內存也不如SATA或者是NVMe的SSD的容量大.
而且比較昂貴, 不支持國產化. 

影響硬盤的性能參數

磁盤容量以及剩餘容量對IO性能的影響.
磁盤容量和剩餘容量其實對性能是有所影響的, 機械硬盤中不同的存儲盤片對性能也有影響.
1. CMR和SMR 
CMR是conventional 傳統的磁盤, 每個扇區嚴格獨立的.不會有交叉
SMR Shingle 疊瓦硬盤. 每個扇區會有一定程度的overlap, 讀寫時需要單獨處理.
CMR的磁盤單片不會特別大, 同時SMR的磁盤可以做到很大的容量.
但是CMR的性能是比SMR硬盤高很多, 數據庫級別的應用使用SMR就是一場災難,甚至會帶來數據
丟失的嚴重風險. 
2. 機械硬盤的剩餘容量與單片容量
最開始的硬盤的扇區大小是不一樣大的,但是他們相對於中心的角度是恆定的.
當時的扇區不管是0磁道的還是最內圈的速度都是一致的.
但是爲了提高磁盤容量, 現在的硬盤的扇區大小一樣,也就導致,磁盤的磁頭在掃過硬盤時線速度是不
一樣的外圈的讀寫速度會比內圈的讀寫速度快很多.基本上是扇區所在周長的比率的關係. 
磁盤爲了性能都是先從完全開始讀寫. 內圈最後讀寫. 所以磁盤剩餘容量很少時他的性能會明顯下降.
SAS硬盤因爲高轉速, 一般盤片的容量較小, 性能也較好,一般大容量的性能一般都會差一些.
3.固態硬盤的容量.
前面講過,固態硬盤因爲有寫放大和GC的存在,如果容量減低,寫放大會嚴重影響寫入性能.又因爲
固態硬盤使用多控制器同時去讀寫NAND的芯片, 其實時實現了一定程度上raid0的處理, 所以容量
越大, 一般需要的芯片越多 raid0對應的NAND芯片也遇到, 寫入分散程度就會越大,這樣固態硬盤的
的寫入性能就越好. 所以固態硬盤,建議選擇大容量, 並且非常不建議用的非常滿.

第四部分 製程與工藝

這一塊可能比較虛一些.
芯片的體質一般在封裝測試時一般就已經確定了.
型號和主頻,睿頻信息就基本確定了. 

Intel最近好多年一直受制於 14nm工藝,導致AMD使用臺積電的7nm 5nm工藝成功實現了逆襲
現在x86芯片的市場佔有率, AMD已經超過了2006年速龍時20%的巔峯狀態. 

但是也要看到AMD基本上是靠性價比來跟Intel進行對抗, 並且Chiplet的構型可以用於
高性能HPC或者是互聯網雲服務, 微服務化的部署, 但是對數據庫等極度複雜的應用場景
Intel的還是具有一定的優勢(CPU核間互相訪存延遲較低.)

但是也要看到. 隨着技術的發展, 沒有公司後者人是安全的稍有不慎就會跟玻璃基板的AMD
硬盤一樣, 因爲客戶的信任消失而蕩然無存. 

CPU都有一個TDP 熱設計功耗的參數, 一般情況下CPU在睿頻時都會超過TDP的數值,這個時候
工藝的重要性就提現出來了. 好的工藝和製程能夠讓CPU更好的完成高頻的任務.
與之對應的, 現在服務器都有電源管理, 如果不是極度追求PUE, 建議能將電源模式設置爲最高
性能, 這樣的話能夠壓榨出最好的服務器性能來.

第五部分 文件系統與虛擬化

Oracle RAC以及Oracle的eXadata一體機有着卓越的性能.
他們有一個殺手鐗是 ASM文件存儲, 直接由Oracle數據庫管理程序管理來管理
磁盤的 raw 裸設備. 能夠降低操作系統管理磁盤時的fsync後者是sync系統調用
導致的延遲, 也可以實現操作系統自己的數據庫與物理文件的映射.性能更高.

關於文件系統, Windows系統有NTFS文件系統. linux系統有ext3.ext4.xfs等
以及還有一些更加新的文件系統. 
但是需要注意, 性能與安全是雙刃劍, 性能好往往會導致一定的安全問題, 這一塊
需要重點關注. 

關於虛擬化: 應用服務器是可以使用虛擬機的. 但是數據庫服務器非常不建議使用
虛擬化,以及使用鏡像的模式. 可能會導致更多的延遲和不確定性.

計算機科學可以通過多加層次的模式來提高開發效率和便於理解
但是提高性能必須通過縮減層數來實現, 減少命令數能夠減少週期,提高性能. 

第六部分 網絡

前面的內容主要是單機的性能, 但是隨着應用的發展,單機已經無法支撐龐大的業務系統.
所以網絡層變的尤爲重要, 這裏簡單總結一下影響網絡的相關事項: 
1. 儘量減少不必要的網絡IO
2. 儘量合併網絡請求, Http儘量使用強連接而不是短連接. 
3. 交互頻率和次數較多的環境儘量物理和網絡邏輯上部署的近一些,減少網絡跳數.
4. 能夠內容調用使用IP地址儘量使用IP地址後者內部域名, 不要使用外部域名. 
5. 調整網卡的緩存大小, 比如ringbuffer等. 
6. 減少內存Copy 使用 epoll或者是DMA提高效率. 
7. 要使用充足的網絡端口, K8S也有類似的需求. 
8. 避免連接隊列溢出, 提高隊列容量.
9. 減少握手重試此時, 也可以防止一定的TCP_FLOOD攻擊.
10.TIME_WAIT進行優化, 避免等待太長,導致端口用盡.

網絡相關影響因素

1. 網線以及水晶頭的質量, 建議至少六類或者是超六類屏蔽雙絞線.
2. 有條件上光纖, 光信號傳輸應該比電信號傳輸更可靠和效率高.
3. 交換機儘量專用.業務網絡,控制網絡,監控網絡儘量拆分,避免互相影響.
4. 儘量使用高配置的交換機, 背板性能良好, 故障率,丟包率低的設備
5. 避免線纜的過分彎折,和設備距離較遠,保證溫度,溼度,以及磁場正常.
6. 注意宿主機的網卡驅動,以及速率以及雙工選擇,避免異常情況.
7. 是否存在IP地址衝突,mac地址衝突,虛擬mac地址等異常問題.

網絡部分參數命令

  • 注意 具體參數值需要根據配置來調整.
ethtool -G eth1 rx 4096 tx 4096
vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 5000 65000
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tw_recycle = 1
net.core.somaxconn=1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_max_tw_buckets = 32768

總結


服務器性能到底有誰來決定

個人認爲服務器的性能是有木桶的短板來決定.
數據庫服務器性能的提升一直是不停的提高短板的高度來提高的.

要根據數據庫的情況來進行適度的調整. 
1. 如果是併發量較少的環境, 一般是內存和IO的壓力比較多一些.
2. 如果是併發量很高的環境, 數據庫數據量又較大, 併發執行的SQL
   時間很長,而且如果遠大於CPU的核心數, 那麼數據庫服務器就會出現
   大量的進程上下文切換, 上下文換切換會刷新TLB,導致大量的cache-miss. 
   會導致性能更加難以爲繼. 
3. 數據庫內存的合理分配也很關鍵. 需要根據業務類型合理分配buffer區域
   或者是分配編譯後的code cache. 以及留足足夠的空間給線程創建以及
   數據庫自己的管理自己進程進行調度. 
4. 不要以數據庫100%的壓力時來設定最終操作系統支持的數值. x86因爲有HT
   超線程以及因爲有亂序和指令預測執行,性能測試的很多動作CPU是很好進行
   預算和判斷的,但是實際生產場景很多操作都是沒有規律可以預測和判斷的.
   所以性能測試的結果可能會因爲程序的時間和空間的侷限性將併發數據計算的
   較高. 所以一定要留有一定的空間給操作系統和數據庫管理進行維護和使用.
5. 儘可能的優化SQL. 避免hard parse較多,以及不合理的關聯和表順序.儘量
   優化索引, 避免全表掃描. 日誌表等冷數據較多的場景儘量分表來處理.併發量
   較高的表在創建時儘量一次多initial 較高的磁盤區塊, 以提前拆表後首次
   的訪問性能和效率. 

分表分區讀寫分離以及拆分SU分庫時性能表現基準問題

分表分區是一個解決性能問題的最快的方法. 
需要說明的是:
如果現實分區分表,最好能夠實現在不同的物理機器上面的分區分表
這樣才能夠最大化的系統性能. 
所有的拆分都是有一定的overhead開銷的, 如果在同一個物理機器上面,這種開銷肯定是
無法抹除的, 只有分攤到不同機器上面實現 1+1=2的極限IO性能才能提高吞吐量.

讀寫分離也是類似. 必須將讀和寫的IO分攤到不同的物理機器上面纔可以實現最大化的性能.
讀寫分離和分區分表其實都是在應用層與數據庫層之間增加了一個路由層, 增加一層肯定是有
相關的性能損耗的, 必須通過加機器的方式來攤薄新的一層的開銷才能夠實現容量的提升.

拆分SU與分庫的道理也是等同的. 
拆分SU會降低單一操作者情況下的響應時間. 
他將一個機器內的不同線程之間的調度改成了跨機器跨進程間的網絡調度, 性能肯定有損耗. 
同一進程內可能只需要線程切換和內存變量在堆區和工作內存的存取的消耗. 
跨進程RPC調用的流程可能是
本進程取數->序列號->網絡棧->網絡硬件設備(時延+帶寬)->對方SU進程獲取->反序列化->加載內存.進行計算
如果RPC交互增多, 這樣的時間損耗是非常致命的. 
而且如果調用之間是阻塞的, 會導致響應時間指數級的下降.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章