Linux高併發調優

Linux高併發調優

一 高併發概念

1.1 高併發概念

高併發(High Concurrency)是互聯網分佈式系統架構設計中必須考慮的因素之一,它一般是指,經過設計保證系統可以同時並行處理不少請求html

1.2 高併發相關指標

  • 響應時間(Response Time)
    • 系統對請求作出響應的時間。例如系統處理一個HTTP請求須要200ms,這個200ms就是系統的響應時間
  • 吞吐量(Throughput)
    • 單位時間內處理的請求數量
  • 每秒查詢率QPS(Query Per Second)
    • 每秒響應請求數。在互聯網領域,這個指標和吞吐量區分的沒有這麼明顯
  • 併發用戶數(User Concurrence)
    • 同時承載正常使用系統功能的用戶數量。例如一個即時通信系統,同時在線量必定程度上表明瞭系統的併發用戶數

1.3 高併發優化方面

  1. 單進程最大打開文件數限制
  2. 內核TCP參數方面
  3. IO事件分配機制

二 提高系統的併發能力

2.1 垂直擴展

  • 提高單機處理能力
    1. 加強單機硬件性能,例如:增長CPU核數如32核,升級更好的網卡如萬兆,升級更好的硬盤如SSD,擴充硬盤容量如2T,擴充系統內存如128G
    2. 提高單機架構性能,例如:使用Cache來減小IO次數,使用異步來增長單服務吞吐量,使用無鎖數據結構來減小響應時間

2.2 水平擴展

  • 增長服務器數量,就能線性擴充系統性能

2.3 常見互聯網分層架構

(1)客戶端層:典型調用方是瀏覽器browser或者手機應用APPlinux

(2)反向代理層:系統入口,反向代理nginx

(3)站點應用層:實現核心應用邏輯,返回html或者jsonweb

(4)服務層:若是實現了服務化,就有這一層數據庫

(5)數據-緩存層:緩存加速訪問存儲json

(6)數據-數據庫層:數據庫固化數據存儲vim

2.4 水平擴展架構

  1. 反向代理層的水平擴展後端

  2. 當nginx成爲瓶頸的時候,只要增長服務器數量,新增nginx服務的部署,增長一個外網ip,就能擴展反向代理層的性能,作到理論上的無限高併發瀏覽器

  3. 經過「DNS輪詢」實現的:dns-server對於一個域名配置了多個解析ip,每次DNS解析請求來訪問dns-server,會輪詢返回這些ip緩存

  4. 站點層的水平擴展

    1. 經過「nginx」實現的。經過修改nginx.conf,能夠設置多個web後端
    2. 當web後端成爲瓶頸的時候,只要增長服務器數量,新增web服務的部署,在nginx配置中配置上新的web後端,就能擴展站點層的性能,作到理論上的無限高併發
  5. 服務層的水平擴展

    1. 經過「服務鏈接池」實現的
    2. 站點層經過RPC-client調用下游的服務層RPC-server時,RPC-client中的鏈接池會創建與下游服務多個鏈接,當服務成爲瓶頸的時候,只要增長服務器數量,新增服務部署,在RPC-client處創建新的下游服務鏈接,就能擴展服務層性能,作到理論上的無限高併發
  6. 數據層的水平擴展

    1. 數據層(緩存,數據庫)涉及數據的水平擴展,將本來存儲在一臺服務器上的數據(緩存,數據庫)水平拆分到不一樣服務器上去,以達到擴充系統性能的目的。

    2. 存儲必定範圍的數據

      1. user0庫,存儲uid範圍1-1kw
      2. user1庫,存儲uid範圍1kw-2kw
    3. 按照哈希水平拆分

      1. user0庫,存儲偶數uid數據
      2. user1庫,存儲奇數uid數據

三 單臺Linux服務器提高併發

3.1 iptables相關

  1. 關閉iptables防火牆,阻止kernel加載iptables模塊

  2. 單進程最大打開文件數限制(默認單個進程最大打開1024個文件)

    1. ulimit –n 65535
  3. 修改Linux系統對用戶的打開文件數的軟限制和硬限制

    1. vim /etc/security/limits.conf
      * soft nofile 65535   #'*'表示修改全部用戶的限制
      * hard nofile 65535
    2. #用戶完成系統登陸後讀取/etc/security/limits.conf文件
      vim /etc/pam.d/login
      sessionrequired /lib/security/pam_limits.so

3.2 內核TCP參數

  1. ​ TIME_WAIT狀態

    1. TCP鏈接斷開後,會以TIME_WAIT狀態保留必定的時間,而後纔會釋放端口。當併發請求過多的時候,就會產生大量的TIME_WAIT狀態的鏈接,沒法及時斷開的話,會佔用大量的端口資源和服務器資源

    2. #查看TIME_WAIT狀態鏈接
      netstat -n | grep tcp | grep TIME_WAIT |wc -l
    3. # vim /etc/sysctl.conf
      net.ipv4.tcp_syncookies= 1 #表示開啓SYNCookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少許SYN攻擊,默認爲0,表示關閉;
      net.ipv4.tcp_tw_reuse= 1 #表示開啓重用。容許將TIME-WAITsockets從新用於新的TCP鏈接,默認爲0,表示關閉;
      net.ipv4.tcp_tw_recycle= 1 #表示開啓TCP鏈接中TIME-WAITsockets的快速回收,默認爲0,表示關閉;
      net.ipv4.tcp_fin_timeout= 30  #修改系統默認的TIMEOUT 時間。
相關文章
相關標籤/搜索