2011年12月28日 星期三

LINUX性能調優方法總結

性能。設置內核參數的方法是通過 proc 接口,也就是通過讀寫 /proc 中的值。幸運的是,sysctl 可以讀取 /etc/sysctl.conf 中的值並根據需要填充
    /proc,這樣就能夠更輕松地管理這些參數。清單 2 展示在互聯網服務器上應用於 Internet 服務器的壹些比較激進的網絡設置。
    # Use TCP syncookies when needed
    net.ipv4.tcp_syncookies = 1
    # Enable TCP window scaling
    net.ipv4.tcp_window_scaling: = 1
    # Increase TCP max buffer size
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    # Increase Linux autotuning TCP buffer limits
    net.ipv4.tcp_rmem = 4096 87380 16777216
    net.ipv4.tcp_wmem = 4096 65536 16777216
    # Increase number of ports available
    net.ipv4.ip_local_port_range = 1024 65000
    將這些設置添加到 /etc/sysctl.conf 的現有內容中。第壹個設置啟用 TCP SYN cookie。當從客戶機發來新的 TCP 連接時,數據包設置了 SYN 位,服務
    器就為這個半開的連接創建壹個條目,並用壹個 SYN-ACK 數據包進行響應。在正常操作中,遠程客戶機用壹個 ACK 數據包進行響應,這會使半開的連接
    轉換為全開的。有壹種稱為 SYN 泛濫(SYN flood) 的網絡攻擊,它使 ACK 數據包無法返回,導致服務器用光內存空間,無法處理到來的連接。SYN
    cookie 特性可以識別出這種情況,並使用壹種優雅的方法保留隊列中的空間(細節參見參考資料壹節)。大系統都默認啟用這個特性,但是確保配
    置這個特性更可靠。
    啟用 TCP 窗口伸縮使客戶機能夠以更高的速度下載數據。TCP 允許在未從遠程端收到確認的情況下發送多個數據包,默認設置是最多 64 KB,在與延遲比
    較大的遠程客戶機進行通信時這個設置可能不夠。窗口伸縮會在頭中啟用更多的位,從而增加窗口大小。
    後面四個配置項增加 TCP 發送和接收緩沖區。這使應用程序可以更快地丟掉它的數據,從而為另壹個請求服務。還可以強化遠程客戶機在服務器繁忙時發
    送數據的能力
    最後壹個配置項增加可用的本地端口數量,這樣就增加了可以同時服務的最大連接數量。
    在下壹次引導系統時,或者下壹次運行 sysctl -p /etc/sysctl.conf 時,這些設置就會生效。
    ----------------------------------------------------------------------------------------------------------------------------
    磁盤子系統的調優
    磁盤在 LAMP 架構中扮演著重要的角色。靜態文件、模板和代碼都來自磁盤,組成數據庫的數據和索引也來自磁盤。對磁盤的許多調優(尤其是對於數
    據庫)集中於避免磁盤訪問,因為磁盤訪問的延遲相當高。因此,花壹些時間對磁盤硬件進行優化是有意義的。
    首先要做的是,確保在文件系統上禁用 atime 日誌記錄特性。atime 是最近訪問文件的時間,每當訪問文件時,底層文件系統必須記錄這個時間戳。因為
    系統管理員很少使用 atime,禁用它可以減少磁盤訪問時間。禁用這個特性的方法是,在 /etc/fstab 的第四列中添加 noatime 選項。
    演示如何啟用 noatime 的 fstab 示例
    /dev/VolGroup00/LogVol00 / ext3 defaults,noatime 1 1
    LABEL=/boot /boot ext3 defaults,noatime 1 2
    devpts /dev/pts devpts gid=5,mode=620 0 0
    tmpfs /dev/shm tmpfs defaults 0 0
    proc /proc proc defaults 0 0
    sysfs /sys sysfs defaults 0 0
    LABEL=SWAP-hdb2 swap swap defaults 0 0
    LABEL=SWAP-hda3 swap swap defaults 0 0
    有多種磁盤硬件組合,而且 Linux 不壹定能夠探測出訪問磁盤的最佳方式。可以使用 hdparm 命令查明和設置用來訪問 IDE 磁盤的方法。hdparm -t
    /path/to/device 執行速度測試,可以將這個測試結果作為性能基準。為了使結果盡可能準確,在運行這個命令時系統應該是空閑的。
    在 /dev/hd 上執行的速度測試
    # hdparm -t /dev/hda
    /dev/hda:
    Timing buffered disk reads: 182 MB in 3.02 seconds = 60.31 MB/sec
    hdparm 的常用選項
    選項 描述
    -vi 向磁盤查詢它支持的設置以及它正在使用的設置。
    -c 查詢/啟用 (E)IDE 32 位 I/O 支持。hdparm -c 1 /dev/hda 啟用這個設置。
    -m 查詢/設置每中斷多扇區模式。如果設置大於零,設置值就是每個中斷可以傳輸的最大扇區數量。
    -d 1 -X 啟用直接內存訪問(DMA)傳輸並設置 IDE 傳輸模式。hdparm 手冊頁詳細說明了在 -X 後面可以設置的數字。只有在 -vi 說明目前並未使用最
    快速的模式的情況下,才需要進行這個設置。
    不幸的是,對於 Fiber Channel and Small Computer Systems Interface(SCSI)系統,調優依賴於具體的驅動器。
    必須將有幫助的設置添加到啟動腳本中,比如 rc.local。
    ----------------------------------------------------------------------------------------------------------------------------
    TCP/IP子系統的調優
    所有的TCP/IP調優參數都位於/proc/sys/net/目錄。 例如, 下面是最重要的壹些調優參數, 後面是它們的含義:
    1. /proc/sys/net/core/rmem_max — 最大的TCP數據接收緩沖
    2. /proc/sys/net/core/wmem_max — 最大的TCP數據發送緩沖
    3. /proc/sys/net/ipv4/tcp_timestamps — 時間戳在(請參考RFC 1323)TCP的包頭增加12個字節
    4. /proc/sys/net/ipv4/tcp_sack — 有選擇的應答
    5. /proc/sys/net/ipv4/tcp_window_scaling — 支持更大的TCP窗口。 如果TCP窗口最大超過65535(64K), 必須設置該數值為1
    6. rmem_default — 默認的接收窗口大小
    7. rmem_max — 接收窗口的最大大小
    8. wmem_default — 默認的發送窗口大小
    9. wmem_max — 發送窗口的最大大小
    /proc目錄下的所有內容都是臨時性的, 所以重啟動系統後任何修改都會丟失。
    建議在系統啟動時自動修改TCP/IP參數:
    把下面代碼增加到/etc/rc.local文件, 然後保存文件, 系統重新引導的時候會自動修改下面的TCP/IP參數:
    echo 256960 > /proc/sys/net/core/rmem_default
    echo 256960 > /proc/sys/net/core/rmem_max
    echo 256960 > /proc/sys/net/core/wmem_default
    echo 256960 > /proc/sys/net/core/wmem_max
    echo 0 > /proc/sys/net/ipv4/tcp_timestamps
    echo 1 > /proc/sys/net/ipv4/tcp_sack
    echo 1 > /proc/sys/net/ipv4/tcp_window_scaling
    TCP/IP參數都是自解釋的, TCP窗口大小設置為256960, 禁止TCP的時間戳(取消在每個數據包的頭中增加12字節), 支持更大的TCP窗口和TCP有選擇的
    應答。
    上面數值的設定是根據互連網連接和最大帶寬/延遲率來決定。
    註: 上面實例中的數值可以實際應用, 但它只包含了壹部分參數。
    另外壹個方法: 使用 /etc/sysctl.conf 在系統啟動時將參數配置成您所設置的值:
    net.core.rmem_default = 256960
    net.core.rmem_max = 256960
    net.core.wmem_default = 256960
    net.core.wmem_max = 256960
    net.ipv4.tcp_timestamps = 0
    net.ipv4.tcp_sack =1
    net.ipv4.tcp_window_scaling = 1
    ----------------------------------------------------------------------------------------------------------------------------
    文件子系統的調優
    ulimit -a 用來顯示當前的各種用戶進程限制。
    Linux對於每個用戶,系統限制其最大進程數。為提高性能,可以根據設備資源情況,
    設置各linux 用戶的最大進程數,下面我把某linux用戶的最大進程數設為10000個:
    ulimit -u 10000
    對於需要做許多 socket 連接並使它們處於打開狀態的 Java 應用程序而言,
    最好通過使用 ulimit -n xx 修改每個進程可打開的文件數,缺省值是 1024。
    ulimit -n 4096 將每個進程可以打開的文件數目加大到4096,缺省為1024
    其他建議設置成無限制(unlimited)的壹些重要設置是:
    數據段長度:ulimit -d unlimited
    最大內存大小:ulimit -m unlimited
    堆棧大小:ulimit -s unlimited
    CPU 時間:ulimit -t unlimited
    虛擬內存:ulimit -v unlimited
    暫時地,適用於通過 ulimit 命令登錄 shell 會話期間。
    永久地,通過將壹個相應的 ulimit 語句添加到由登錄 shell 讀取的文件中, 即特定於 shell 的用戶資源文件,如:
    1)、解除 Linux 系統的最大進程數和最大文件打開數限制:
    vi /etc/security/limits.conf
    # 添加如下的行
    * soft noproc 11000
    * hard noproc 11000
    * soft nofile 4100
    * hard nofile 4100
    說明:* 代表針對所有用戶
    noproc 是代表最大進程數
    nofile 是代表最大文件打開數
    2)、讓 SSH 接受 Login 程式的登入,方便在 ssh 客戶端查看 ulimit -a 資源限制:
    a、vi /etc/ssh/sshd_config
    把 UserLogin 的值改為 yes,並把 # 註釋去掉
    b、重啟 sshd 服務:
    /etc/init.d/sshd restart
    3)、修改所有 linux 用戶的環境變量文件:
    vi /etc/profile
    ulimit -u 10000
    ulimit -n 4096
    ulimit -d unlimited
    ulimit -m unlimited
    ulimit -s unlimited
    ulimit -t unlimited
    ulimit -v unlimited
    /**************************************
    有時候在程序裏面需要打開多個文件,進行分析,系統壹般默認數量是1024,(用ulimit -a可以看到)對於正常使用是夠了,但是對於程序來講,就太少
    了。
    修改2個文件。
    1./etc/security/limits.conf
    vi /etc/security/limits.conf
    加上:
    * soft nofile 8192
    * hard nofile 20480

沒有留言: