知乎專欄 | 多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者” |
數不清的用戶在訪問你的伺服器
頻寬與伺服器可以隨時增加,但也有限,如果你不清楚影響流量的因素,增加伺服器也無濟於事。瓶頸無處不在,你必須將各個瓶頸分析出來,並各個擊破,才能達到你的目的。
正常的IDC硬件佈局
user -> \ /--1G--> | server | user -> |--1G--> [Firewal] --1G--> [Switch] ----1G--> | server | user -> / \--1G--> | server |
主流網絡設備頻寬均為1G,目前來看10G仍不普及,僅在存儲領域封閉使用,價格非常昂貴
firewall (1G) - switch (Forwarding bandwidth / 1G) - server (NIC 1G)
怎麼能提高頻寬呢?
首先是防火牆,這個設備非常重要。 100M 基本淘汰,10G 防火牆尚未普及,1G頻寬如果不夠怎麼辦?答案是買2個,3個...
為什麼不買10G的。在下面會談到會話數,你一看就明白了。10G防火牆會話數不是1G防火牆會話數的十倍。
目前主流交換機 Cisco WS-C2960G-48TC-L,48個RJ45口與2或4個SFP光纖口均為1G頻寬
一般中小企業1台交換機足夠,再上一個台階超過40台伺服器,就會有出現多台交換機互連問題,使用乙太網口與SFP光纖口的頻寬是一樣的,唯一區別是傳輸距離。
每個交換機後面都對應幾十台伺服器,每個伺服器1G網卡,如果這些伺服器滿負荷傳輸,交換機與交換機間數據傳輸就會帶來瓶頸。
通過連接埠聚合可以解決交換機間數據傳輸瓶頸,另種方式是交換機堆疊。
+----------+ +----------+ | |gi0/0/1 gi0/0/1| | | Switch A +--------------------------+ Switch B | | +--------------------------+ | | |gi0/0/2 gi0/0/2| | +----------+ +----------+
比如你有5個機櫃,將交換機放置到3號機櫃,處于中間位置,所有交換機放入該機櫃,然後堆疊,從中心機櫃向兩側分綫
對於不大不小的企業,直接採購IDC箱式交換機
Example 1 : host to host at double speed +----------+ +----------+ | |eth0 eth0| | | Host A +--------------------------+ Host B | | +--------------------------+ | | |eth1 eth1| | +----------+ +----------+ On each host : # modprobe bonding miimon=100 # ifconfig bond0 addr # ifenslave bond0 eth0 eth1 Example 2 : host to switch at double speed +----------+ +----------+ | |eth0 port1| | | Host A +--------------------------+ switch | | +--------------------------+ | | |eth1 port2| | +----------+ +----------+ On host A : On the switch : # modprobe bonding miimon=100 # set up a trunk on port1 # ifconfig bond0 addr and port2 # ifenslave bond0 eth0 eth1 Example 3: High Availability in a Multiple Switch Topology | | |port3 port3| +-----+----+ +-----+----+ | |port2 ISL port2| | | switch A +--------------------------+ switch B | | | | | +-----+----+ +-----++---+ |port1 port1| | +-------+ | +-------------+ host1 +---------------+ eth0 +-------+ eth1 Example 4: Maximum Throughput in a Multiple Switch Topology Multiple switches may be utilized to optimize for throughput when they are configured in parallel as part of an isolated network between two or more systems, for example: +-----------+ | Host A | +-+---+---+-+ | | | +--------+ | +---------+ | | | +------+---+ +-----+----+ +-----+----+ | Switch A | | Switch B | | Switch C | +------+---+ +-----+----+ +-----+----+ | | | +--------+ | +---------+ | | | +-+---+---+-+ | Host B | +-----------+ Example 5: Using multiple host and multiple switches to build a "no single point of failure" solution. | | |port3 port3| +-----+----+ +-----+----+ | |port7 ISL port7| | | switch A +--------------------------+ switch B | | +--------------------------+ | | |port8 port8| | +----++----+ +-----++---+ port2||port1 port1||port2 || +-------+ || |+-------------+ host1 +---------------+| | eth0 +-------+ eth1 | | | | +-------+ | +--------------+ host2 +----------------+ eth0 +-------+ eth1
目前主流服務都配備2到4個網口,像IBM / HP / DELL 等品牌伺服器你無需關心網卡問題.
這裡主要是針對自行安裝或使用PC伺服器的用戶,因為很多PC伺服器使用Realtak網卡。那麼Realtak與Broadcom的NetXtreme有什麼不同?
建議你安裝一個windows系統在伺服器上,然後看看網卡驅動屬性。Realtak 僅僅提供基本網絡功能,QOS質量訪問服務由驅動程式提供(軟QOS)而NetXtreme 提供非常豐富的功能,並且都是硬件實現。
話題回到頻寬上,linux 支持 bonding 網卡,可以幫你解決伺服器網絡通信頻寬問題,bonding 還可以解決網卡故障轉移,傳輸流量負載均衡等等。
在我的《Netkiller Linux 手札》中你可以找到具體的設置方法。
firewall (nat session) - switch (Forwarding bandwidth) - os (ulimit,sysctl) - application (httpd,vsftpd,tomcat ...)
會話數,國人俗稱並發數。當你的頻寬沒有滿,但tcp不能建立連接,這時你就要考慮會話數了。
購買防火牆的時候主要有兩個指標,一是會話數,二是頻寬,三是配備模組。售前工程師都會交代清楚。
例如 Cisco ASA 5550 會話數65萬,2個1G介面,可選IPS模組等等...
使用下面命令可以查看當前會話數
show conn count
如果你網站或介面有100萬訪問量,那麼即使頻寬沒有滿,也無法在建立TCP連接,這時你需要增加線路,增加防火牆。
Linux 影響會話數的的參數與配置檔案
/etc/security/limits.conf , /etc/security/limits.d
nofile - max number of open files 在POSIX系統中硬件,管道,Socket 均被看作是一個設備,如硬碟是塊設備,顯示器是字元設備,操作這些設備均使用c的open函數,被算作打開一個檔案。所有設備都是如此,加上web伺服器還要讀取很多HTML檔案,系統對nofile 開銷是非常巨大的。
nproc - max number of processes 目前多綫程是主流,使用多綫程技術這個參數可以不關心。像Oracle,PostgreSQL, Apache prefork,你就需要關心這個參數
/etc/sysctl.conf , /etc/sysctl.d/
net.ipv4.ip_local_port_range = 1024 65500 可用連接埠範圍
tcp 協議當你嘗試主動與伺服器建立連接,如:telnet 172.16.0.1 80,本地會開啟一個大於1024小於65500的連接埠
client: localhost:1025 --- 172.16.0.1:80 server
以上參數要綜合你的CPU處理能力,內存空間,硬碟IO等等,才能配置出合理數值
配置過大(小馬拉大車),超出你的伺服器處理能力,導致伺服器無響應,最終只能重啟
配置過小(大馬拉小車),你的伺服器長時間處于空間狀態,CPU,內存沒有得到合理使用
在我的《Netkiller Linux 手札》中你可以找到具體的設置方法。
連接數受限與limits與sysctl
Nginx
worker_processes 8; 處理器數 worker_rlimit_nofile 65530; 允許最多打開檔案數 worker_connections 4096; 最大連接數數為 keepalive_timeout 65; 開啟復用連接
apache : httpd/conf/extra/httpd-mpm.conf
<IfModule mpm_worker_module> ServerLimit 16 ThreadLimit 256 StartServers 8 MaxClients 4096 MinSpareThreads 64 MaxSpareThreads 256 ThreadsPerChild 256 MaxRequestsPerChild 10000 </IfModule>
mysql : /etc/my.cnf
[mysqld] max_connections=250
不依依列舉,有興趣看我的系列文檔。
IO (Input/Output) 輸入/輸出,在國內被泛指硬碟IO,沒辦法這裡也不例外,也被指為硬碟IO
影響IO的幾個參數:
硬碟轉速與硬碟速率
RAID卡速率
以Dell為例,去官網查看一下http://www.dell.com/content/topics/topic.aspx/global/products/pvaul/topics/en/us/raid_controller?c=us&l=en&cs=555
PERC H700 Integrated / Adapter: 6Gb/s SAS
SAS 硬碟介面 3Gbps,理論讀寫速度300MB/S,實際情況沒有這麼理想。
RAID0 / RAID10是提高IO最有效的手段,但是你從上面數據計算。6塊SAS硬碟做Raid 0 傳輸速率可以達到18Gb/s,但RAID卡H700只能達到6Gb/s,整體頻寬並沒有提高。
這樣做的意義是在Raid頻寬與硬碟速度不變的情況下,讀寫所花費的時間減少了,提高了列隊處理速度,減少IO排隊。
IO的問題就是IO排隊等待問題,而不是傳輸頻寬不夠用
在經濟緊張的情況下,可以使用多塊獨立硬碟分佈IO,每塊硬件分別做獨立存儲,比如資料庫可以採用這種方案:可以一塊硬碟存數據,一塊硬碟做索引,另一塊做日誌等等,禁止交叉。
在經濟允許的情況下,你可以配置多個RAID卡,外掛DAS。或者採用集群加分散式檔案系統方案
http://zh.wikipedia.org/wiki/ISCSI
iSCSI 可以提供1GB,10GB數據傳輸,傳輸介質可以選擇雙絞綫或者光纖
FCoE 通過乙太網傳輸FC協議,與iSCSI有很多相似之處