Linux系統內核:修改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(64KB), 必須設置該數值為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 |
?linux文件描述符1024限制
今天突然報了 open files limit...原來linux默認的文件描述符1024(ulimit -a命令查看)被用光了,為了增大文件描述符號,說要編譯內核才行,今天研究了半天,居然沒成功,后來干脆,用 ulimit -HSa 65536 (1MB64個文件描述符)似乎也生效,這里特別需要注意的地方,別忘了將上面一句加入到/etc/profile里面去,然后用lsof -p JAVA_PID|wc -l 查看jboss似乎已經可以跑到了1758.
因為squid 的工作方式,文件描述符的限制可能會極大的影響性能。當squid 用完所有的文件描述符后,它不能接收用戶新的連接。也就是說,用完文件描述符導致拒絕服務。直到一部分當前請求完成,相應的文件和socket 被關閉,squid 不能接收新請求。當squid發現文件描述符短缺時,它會發布警告。
在運行./configure 之前,檢查你的系統的文件描述符限制是否合適,能給你避免一些麻煩。大多數情況下,1024 個文件描述符足夠了。非常忙的cache可能需要4096或更多。在配置文件描述符限制時,我推薦設置系統級限制的數量為每個進程限制的2 倍。
1024
我們用命令
Linux
在Linux 上配置文件描述符有點復雜。在編譯squid 之前,你必須編輯系統include 文件中的一個,然后執行一些shell 命令。請首先編輯/usr/include/bits/types.h 文件,改變__FD_SETSIZE 的值:
#define _ _FD_SETSIZE 8192
下一步,使用這個命令增加內核文件描述符的限制:
# echo 8192 >; /proc/sys/fs/file-max
最后,增加進程文件描述符的限制,在你即將編譯squid 的同一個shell 里執行:
sh# ulimit -Hn 8192
該命令必須以root 運行,僅僅運行在bash shell。不必重啟機器。
使用這個技術,你必須在每一次系統啟動后執行上述echo 和ulimit 命令,或者至少在squid 啟動之前。假如你使用某個rc.d 腳本來啟動squid,那是一個放置這些命令的好地方。
基本系統調節
在對系統的 Apache、PHP 和 MySQL 組件進行調優之前,應該花一些時間確保底層 Linux 組件的運行正常。還應該對正在運行的服務進行縮減,只運行需要的那些服務。這不但是一種良好的安全實踐,而且可以節省內存和 CPU 時間。
一些快速的內核調優措施
大多數 Linux 發布版都定義了適當的緩沖區和其他 Transmission Control Protocol(TCP)參數。可以修改這些參數來分配更多的內存,從而改進網絡性能。設置內核參數的方法是通過 proc 接口,也就是通過讀寫 /proc 中的值。幸運的是,sysctl 可以讀取 /etc/sysctl.conf 中的值并根據需要填充 /proc,這樣就能夠更輕松地管理這些參數。清單 2 展示在互聯網服務器上應用于 Internet 服務器的一些比較激進的網絡設置。
清單 2. 包含較為激進的網絡設置的 /etc/sysctl.conf
?????????????? ?
# 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 選項。清單 3 給出了一個配置示例。
清單3. 演示如何啟用 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
?
在清單3中只修改了 ext3 文件系統,因為 noatime 只對駐留在磁盤上的文件系統有幫助。為讓這一修改生效,不需要重新引導;只需重新掛裝每個文件系統。例如,為了重新掛裝根文件系統,運行 mount / -o remount。
有多種磁盤硬件組合,而且 Linux 不一定能夠探測出訪問磁盤的最佳方式。可以使用 hdparm 命令查明和設置用來訪問 IDE 磁盤的方法。hdparm -t /path/to/device 執行速度測試,可以將這個測試結果作為性能基準。為了使結果盡可能準確,在運行這個命令時系統應該是空閑的。清單 4 給出在 hda 上執行速度測試的結果。
清單4. 在 /dev/hd 上執行的速度測試
???????????????
# hdparm -t /dev/hda
/dev/hda:
?Timing buffered disk reads:? 182 MB in? 3.02 seconds =? 60.31 MB/sec
?
這一測試說明,在這個磁盤上讀取數據的速度是大約每秒 60 MB。
在嘗試一些磁盤調優選項之前,必須注意一個問題。錯誤的設置可能損害文件系統。有時候會出現一個警告,指出這個選項與硬件不兼容;但是,有時候沒有警告消息。因此,在將系統投入生產之前,必須對設置進行徹底的測試。在所有服務器上都采用標準的硬件也會有所幫助。
表 2 列出比較常用的一些選項。
表 2. hdparm 的常用選項
選項 描述
-vi 向磁盤查詢它支持的設置以及它正在使用的設置。
-c? 查詢/啟用 (E)IDE 32 位 I/O 支持。hdparm -c 1 /dev/hda 啟用這個設置。
-m 查詢/設置每中斷多扇區模式。如果設置大于零,設置值就是每個中斷可以傳輸的最大扇區數量。
-d1-X 啟用直接內存訪問(DMA)傳輸并設置 IDE 傳輸模式。hdparm 手冊頁詳細說明了在 -X 后面可以設置的數字。只有 在-vi說明目前并未使用最快速的模式的情況下,才需要進行這個設置。
不幸的是,對于 Fiber Channel and Small Computer Systems Interface(SCSI)系統,調優依賴于具體的驅動器。
必須將有幫助的設置添加到啟動腳本中,比如 rc.local。
http://www.linuxeden.com/html/softuse/20070130/25284.html
http://blog.chinaunix.net/u/19673/showart.php?id=302262
http://www.lupaworld.com/viewnews_19052_page_2.html