關於 CPU 中央處理器調優
CPU 處理數據的方式:
1. 批處理,順序處理請求.(切換次數少,吞吏量大)
2. 分時處理.(如同"獨佔",吞吏量小)(時間片,把請求分爲一個一個的時間片,一片一片的分給 CPU 處理)
我們現在使用 x86 就是這種架構
3. 實時處理. 例: 批處理——以前的大型機(Mainframe)上所採用的系統,需要把一批程序事先寫好(打孔紙帶),然 後計算得出結果
分時——現在流行的 PC 機和服務器都是採用這種運行模式,即把 CPU 的運行分成若干時間片分別處理不同的運算請求
實時——一般用於單片機上,比如電梯的上下控制,對於按鍵等動作要求進行實時處理
查看內核一秒鐘中斷 CPU 次數:
[root@silence80 ~]# grep HZ /boot/config-2.6.32-220.el6.x86_64
CONFIG_NO_HZ=y
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000 #1 秒鐘有 1000 次中斷
注: 此文件/boot/config-2.6.32-220.el6.x86_64 是編譯內核的參數文件
調整進程優先級使用更多 CPU
調整進程 nice 值,讓進程使用更多的 CPU
優先級控制:
nice 值 #範圍, -20 ~ 19 越小優先級越高 普通用戶 0-19 nice
作用:以什舉優先級運行進程 。默認優先級是 0
語法: nice -n 優先級數字 命令 例:
#nice -n -5 vim a.txt # vim 進程以-5 級別運行 查看:
ps -axu | grep a.txt
[root@silence80 ~]# ps -axu | grep b.txt
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 24318 0.0 0.2 143624 3280 pts/4 S+ 17:00 0:00 vim b.txt
[root@silence80 ~]# top -p 24318
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24219 root 15 -5 140m 3336 2200 S 0.0 0.3 0:00.08 vim
renice #修改正在運行的進程的優先級
#renice -n 5 PID #修改進程優先級
例:
#renice -n 5 24318
[root@silence80 ~]# top -p 24318
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24219 root 15 5 140m 3336 2200 S 0.0 0.3 0:00.08 vim
檢測一下範圍: -20-19
[root@silence80 ~]# renice -n -21 24219
24219: old priority -20, new priority -20
[root@silence80 ~]# renice -n 20 24219
24219: old priority -20, new priority 19
CPU 親和力
taskset 作用:在多核情況下,可以認爲指定一個進程在哪顆 CPU 上執行程序,減少進程在不同 CPU 之 前切換的開銷
安裝:
[root@silence80 ~]# rpm -qf `which taskset `
util-linux-ng-2.17.2-12.4.el6.x86_64
語法: taskset -c N 命令
例 1:本機是 4 核 CPU ,指定 vim 命令在第一個 CPU 上運行
語法: taskset -c N 命令
[root@silence80 ~]# taskset -c 0 vim a.txt #1 號 CPU ID 是 0
[root@silence80 ~]# ps -axu | grep vim
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 2614 1.3 0.2 143696 3332 pts/0 S+ 18:39 0:00 vim a.txt
[root@silence80 ~]# taskset -p 2614 # -p 要查看的進程 ID
pid 2614's current affinity mask: 1 #CPU 親和力掩碼,1 代表第一個 CPU 核心
例 2:查 sshd 進程運行在哪幾個 CPU 上
[root@silence80 ~]# ps -axu | grep sshd
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 2030 0.0 0.0 64068 1140 ? Ss 18:26 0:00 /usr/sbin/sshd
[root@silence80 ~]# taskset -p 2030
pid 2030's current affinity mask: f #說明 sshd 在 4 顆 CPU 上隨機進行切換。
說明:
Cpu ID 號碼,對應的 16 進制數爲:
8 核 CPU ID: 7 6 5 4 3 2 1 0
對應的 10 十進制數爲: 128 64 32 16 8 4 2 1
當前, 我的系統中 cpu ID 的爲(0,1,2,3)
pid 2030's current affinity mask: f 的值爲 cpu ID 16 進制的值的和(1+2+4+8=f),轉換成二進制爲:1111
這個說明了(pid=2030)的這個 sshd 進程工作在 cpu ID 分別爲 0,1,2,3 這個四個 cpu 上面的切換。
注: 我們的 CPU 是 4 核心,所以 taskset -c 後可以跟: 0,1,2,3
例:指定 vim c.txt 程序運行在第 2 和第 4 個 CPU 上
[root@silence80 ~]# taskset -c 1,3 vim b.txt
[root@silence80 ~]# ps -axu | grep vim
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 6314 1.5 0.2 143612 3280 pts/1 S+ 14:41 0:00 vim b.txt
root 6317 0.0 0.0 103300 848 pts/2 S+ 14:41 0:00 grep vim
[root@silence80 ~]# taskset -p 6314
pid 6314's current affinity mask: a
# a 爲十進制的 10=2+8
注:在哪個 CPU 上運行,那一位就賦爲 1 。 二進制表示爲: 0101=2+8=10
CPU 利用率比例分配:
如果一個 CPU 被充分使用,利用率分類之間均衡的比例應該是
65% - 70% User Time #用戶態
30% - 35% System Time #內核態
0% - 5% Idle Time #空閒
Context Switches - 上下文切換的數目直接關係到 CPU 的使用率,如果 CPU 利用率保持在上述均衡狀態
時,有大量的上下文切換是正常的.
實例 1:持續的 CPU 利用率 在這個例子中,這個系統的 CPU 被充分利用
[root@silence80 ~]# vmstat 1 # 本機爲單核 CPU,執行 vmstat 顯示以下內容
procs --------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 0 130644 86244 609860 0 0 4 1 531 25 0 0 20 0 0
4 0 0 130620 86244 609860 0 0 0 0 638 62 0 0 14 0 0
2 0 0 130620 86244 609860 0 0 0 0 658 62 0 0 13 0 0
4 0 0 130620 86244 609860 0 0 0 0 688 62 0 0 11 0 0
注: 根據觀察值,我們可以得到以下結論:
1,有大量的中斷(in) 和較少的上下文切換(cs).這意味着一個單一的進程正在快速運行
2,進一步顯示某單個應用,user time(us) 經常在 86%或者更多。 執行 top ->按 P->查看使用 CPU 最多的進程
3,運行隊列還在可接受的性能範圍內,其中有 2 個地方,是超出了允許限制.
實例 2:超負荷調度 在這個例子中,內核調度中的上下文切換處於飽和
# vmstat 1 #本機爲單核 CPU,通過查看 vmstat 輸出結果,分析當前系統中出現的問題
procs memory swap io system cpu
r b swpd free buff cache si so bi bo in cs us sy wa id
2 1 207740 98476 81344 180972 0 0 2496 0 900 2883 4 12 57 27
0 1 207740 96448 83304 180984 0 0 1968 328 810 2559 8 9 83 0
0 1 207740 94404 85348 180984 0 0 2044 0 829 2879 9 6 78 7
0 1 207740 92576 87176 180984 0 0 1828 0 689 2088 3 9 78 10
2 0 207740 91300 88452 180984 0 0 1276 0 565 2182 7 6 83 4
3 1 207740 90124 89628 180984 0 0 1176 0 551 2219 2 7 91 0
1,上下文切換數目高於中斷數目,說明當前系統中運行着大量的線程,kernel 中相當數量的時間都開銷在線 程的”上下文切換“。
2,大量的上下文切換將導致 CPU 利用率不均衡.很明顯實際上等待 io 請求的百分比(wa)非常高,以及
user time 百分比非常低(us). 說明磁盤比較慢,磁盤是瓶頸
3,因爲 CPU 都阻塞在 IO 請求上,所以運行隊列裏也有相當數量的可運行狀態線程在等待執行.
總結:說明
內存調優相關內容:
實例 1:安裝完系統後,測試內存
[root@silence80 ~]# rpm -ivh /mnt/Packages/memtest86+-4.10-2.el6.x86_64.rpm
[root@silence80 ~]# memtest-setup
Setup complete.
[root@silence80 ~]# vim /etc/grub.conf #多了一個啓動項
重啓後,在 grub 啓動項中選擇:
Memtest86+ (4.10) 這個項就可以了
4. 關於緩存
BUFFER 索引緩存 緩存 寫時用,先寫入到內存
CACHE 頁緩存 快取 讀時用,先讀入到內存
buffers #緩存從磁盤讀出的內容 ,這種理解是片面的
cached #緩存需要寫入磁盤的內容 ,這種理解是片面的
例 1:
終端 1: free -m
終端 2:find /
終端 1:free -m #查看 buffer 增長
CACHE:頁緩存, 內存頁是內存中的最小存儲單位,一頁尺寸 4kB
對象文件系統 塊 block 1kB 2kB 4kB
扇區 sectors 512b
手動清空 buffer+cache :
[root@silence80 ~]# cat /proc/sys/vm/drop_caches #默認是 0
0
[root@silence80 ~]# free -m
total used free shared buffers cached
Mem: 1137 783 353 0 67 411
-/+ buffers/cache: 303 833
Swap: 999 0 999
[root@silence80 ~]# sync # 把內存中的數據寫入磁盤
[root@silence80 ~]# echo 1 > /proc/sys/vm/drop_caches
[root@silence80 ~]# free -m
total used free shared buffers cached
Mem: 1137 367 770 0 0 67
-/+ buffers/cache: 299 838
Swap: 999 0 999
[root@silence80 ~]# ulimit -a
I/O調優 相關內容
1、設置一個進程可以打開的文件數
[root@silence80 ~]# ulimit -n
1024
測試:
[root@silence80 ~]# service httpd restart
Stopping httpd: [FAILED] Starting httpd: [ OK ]
[root@silence80 ~]# echo 111 > /var/www/html/index.html
[root@silence80 ~]# ab -n 2000 -c 2000 http://192.168.1.63/index.html
This is silence80Bench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The silence80 Software Foundation, http://www.silence80.org/
Benchmarking 192.168.1.63 (be patient)
socket: Too many open files (24)
解決: 限制用戶資源配置文件:/etc/security/limits.conf vim /etc/security/limits.conf #在最添加:
* soft nofile 1024000
* hard nofile 1024000
注:soft 是一個警告值,而 hard 則是一個真正意義的閥值,超過就會報錯。soft 一定要比 hard 小。
2、啓動系統: reboot #永久生效的缺點,必須重啓系統
3、檢查:
[root@silence80 ~]# ulimit -n
1024000
[root@silence80 ~]# useradd mk #以普通用戶登錄,測試
[root@silence80 ~]# su - mk
[silence@silence80 ~]$ ulimit -n
1024000
方法二:#臨時修改
[root@silence80 ~]# ulimit -n 10000
[root@silence80 ~]# ulimit -n
10000
例 2:nproc #用戶可以打開的最大進程數
[root@silence80 ~]# vim /etc/security/limits.d/90-nproc.conf #RHEL6 必須這個文件中配 置
改:
* soft nproc 10240
爲:
* soft nproc 66666
* hard nproc 66666
[root@silence80 ~]# reboot #最好重啓一下
[root@silence80 ~]# ulimit -u
66666
或:
再打一個終端,直接查看
[root@silence80 ~]# ulimit -u
66666
臨時:
[root@silence80 ~]# ulimit -u 60000
[root@silence80 ~]# ulimit -u
60000
注:默認用戶可用的最大進程數量1024.這樣以silence80用戶啓動的進程就數就不能大於1024了。
[root@silence80 ~]# ulimit -a
core file size (blocks, -c) 0 kdump 轉儲功能打開後產生的 core file 大小限制
data seg size (kbytes, -d) unlimited 數據段大小限制
scheduling priority (-e) 0
file size (blocks, -f) unlimited 文件大小限制
pending signals (-i) 27955 max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024 打開的文件個數限制
pipe size (512 bytes, -p) 8 管道大小的限制
POSIX message queues (bytes, -q) 819200 消息隊列大小
real-time priority (-r) 0
stack size (kbytes, -s) 10240 棧大小
cpu time (seconds, -t) unlimited CPU 時間使用限制
max user processes (-u) 27955 最大的用戶進程數限制
virtual memory (kbytes, -v) unlimited 虛擬內存限制
file locks (-x) unlimited
測試硬盤速度:
測試硬盤寫命令: dd
在使用前首先了解兩個特殊設備
/dev/null 僞設備,回收站.寫該文件不會產生IO開銷
/dev/zero 僞設備,會產生空字符流,讀該文件不會產生IO開銷
[root@silence80 ~]# dd if=/dev/zero of=/test.dbf bs=8K count=30000
3000+0 records in
3000+0 records out
24576000 bytes (25 MB) copied, 5.13755 s, 4.8 MB/s 生成 25M 的一個文件,IO 寫的速度約爲 4.8 MB/s 當然這個速度可以多測試幾遍取一個平均值,符合概率統計.
time 命令: 執行命令並計時
例1: 測試dd 命令使用時間和開銷
[root@xuegod64 ~]# time dd if=/dev/zero of=/test.dbf bs=8k count=3000
3000+0 records in
3000+0 records out
24576000 bytes (25 MB) copied, 1.04913 s, 23.4 MB/s real 0m1.061s
user 0m0.002s sys 0m0.770s 註釋:
1)實際時間(real time): 從command命令行開始執行到運行終止的消逝時間;
2)用戶CPU時間(user CPU time): 命令執行完成花費的用戶CPU時間,即命令在用戶態中執行時間總和;
3)系統CPU時間(system CPU time): 命令執行完成花費的系統CPU時間,即命令在覈心態中執行時間總 和。 其中,用戶CPU時間和系統CPU時間之和爲CPU時間,即命令佔用CPU執行的時間總和。實際時間要大於 CPU時間,因爲Linux是多任務操作系統,往往在執行一條命令時,系統還要處理其它任務。 另一個需要注意的問題是即使每次執行相同命令,但所花費的時間也是不一樣,其花費時間是不繫統運行 相關的。
測試硬盤速度:
[root@xuegod64 ~]# hdparm -T -t /dev/sda
/dev/sda:
Timing cached reads: 3850 MB in 2.00 seconds = 1926.60 MB/sec
#2秒中直接從內存的 cache讀取數據的速度讀 3850 MB。 平均1926.60 MB/sec
Timing buffered disk reads: 50 MB in seconds = 13.17 MB/sec
參數:
-t perform device read timings #不使用預先的數據緩衝, 標示了Linux下沒有任何文件系統開 銷時磁盤可以支持多快的連續數據讀取.
-T perform cache read timings #直接從內存的 cache讀取數據的速度。實際上顯示出被測系統的 處理器緩存和內存的吞吏量.
網相關調優: 網卡綁定技術:
/雙線冗餘 功能
\帶寬增備
100M/8 = 12.5MByte/s
Bonding技術 什舉是網卡綁定及簡單原理 網卡綁定也稱作"網卡捆綁",就是使用多塊物理網卡虛擬成爲一塊網卡,以提供負載均衡或者冗餘,增加 帶寬的作用。當一個網卡壞掉時,不會影響業務。這個聚合起來的設備看起來是一個單獨的以太網接口設 備,也就是這幾塊網卡具有相同的IP地址而並行鏈接聚合成一個邏輯鏈路工作。這種技術在Cisco等網絡公 司中,被稱爲Trunking和Etherchannel 技術,在Linux的內核中把這種技術稱爲bonding。 Trunking(鏈路聚集)
二、技術分類
1. 負載均衡
2. 網絡冗餘
實戰:配置多網卡綁定技術
配置環境:
silence80 配置兩雙網卡,網卡eth0和eth1都橋接 添加網卡:
配置:
查看是否加載了bond模塊:
[root@silence80 network-scripts]# modinfo bonding| grep .ko filename:
/lib/modules/2.6.32-220.el6.x86_64/kernel/drivers/net/bonding/bonding.ko
[root@silence80 network-scripts]# modprobe bonding #加載模塊
[root@silence80 ~]# lsmod | grep bond bonding 125610 0
ipv6 322029 158 bonding,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
開機自動加載模塊到內核:
[root@silence80 ~]# echo 'modprobe bonding &> /dev/null' >> /etc/rc.local
[root@silence80 ~]# vim /etc/modprobe.conf #創建此配置文件,並寫入以下內容 編輯模塊載入配置文件,讓系統支持bonding
alias bond0 bonding
options bonding miimon=100 mode=balance-rr
說明:
a. mode=balance-rr 或mode=0 這裏我採用這種rr輪循模式, 此模式提供負載平衡和容錯。 此模式 下所以網卡共用一個MAC地址,後面結果會有驗證!
b. miimon是用來進行鏈路監測的,如:miimon=100,那舉系統每100ms監測一次鏈路連接狀態,如果 有一條線路不通就轉入另一條線路;
c. bonding只能提供鏈路監測,即從主機到交換機的鏈路是否接通。如果只是交換機對外的鏈路down掉
了,而交換機本身並沒有故障,那舉bonding會認爲鏈路沒有問題而繼續使用。
創建bond0設置配置文件
[root@silence80 ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0 #寫入以下內容
DEVICE=bond0
IPADDR=192.168.1.63
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1
ONBOOT=yes BOOTPROTO=none USERCTL=no
創建eth0配置文件:
[root@silence80 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 #寫入以下內容
DEVICE=eth0
USERCTL=no ONBOOT=yes MASTER=bond0
SLAVE=yes BOOTPROTO=none 創建eth1配置文件:
[root@silence80 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 #寫入以下內容
DEVICE=eth1
USERCTL=no ONBOOT=yes MASTER=bond0
SLAVE=yes
BOOTPROTO=none
重啓網卡:
[root@silence80 ~]# service network restart
Shutting down interface eth0: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface bond0: [ OK ]
查看:
[root@silence80 ~]# ifconfig #注此時MAC地址都一樣
bond0 Link encap:Ethernet HWaddr 00:0C:29:12:EC:1E
inet addr:192.168.1.63 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe12:ec1e/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:751 errors:0 dropped:0 overruns:0 frame:0
TX packets:445 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:73353 (71.6 KiB) TX bytes:59783 (58.3 KiB)
eth0
Link encap:Ethernet HWaddr 00:0C:29:12:EC:1E
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:743 errors:0 dropped:0 overruns:0 frame:0
TX packets:432 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
RX bytes:72050 (70.3 KiB) TX bytes:57101 (55.7 KiB)
eth1
Link encap:Ethernet HWaddr 00:0C:29:12:EC:1E Metric:1
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500
測試:
[root@silence80 ~]# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=2.89 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=1.82 ms
[root@silence80 network-scripts]# route -n #查看網關
[root@silence80 network-scripts]# cat /etc/resolv.conf #查看DNS
# Generated by NetworkManager nameserver 192.168.1.1
search localhost
測試高可用:
1、[root@silence80 ~]# ping 192.168.1.1 #打開終端後,持續ping 網關
2、此時可以斷開虛擬機eth1網絡連接,查看ping是否有丟包:
[root@silence80 ~]#ifdown eth0
3、斷開後,發現通信正常,沒有問題。說明多網卡綁定成功
mode=0 : 可實現網絡負載均衡和網絡冗餘,採用平衡輪循策略(balance-rr)。
此模式的特點:
a. 所以網卡都工作,傳輸數據包順序是依次傳輸,也就是說第1個包經過eth0,下一個包就經過eth1,一 直循環下去,直到最後一個包傳輸完畢。
b. 此模式對於同一連接從不同的接口發出的包,中途傳輸過程中再經過不同的鏈接,在客戶端很有可能會 出現數據包無序到達的問題,而無序到達的數據包需要重新要求被髮送,這樣網絡的吞吏量就會下降。
c. 不網卡相連的交換必須做特殊配置( 這兩個端口應該採取聚合方式),因爲做bonding的這兩塊網卡是 使用同一個MAC地址
網絡內核相關參數調優
TCP 連接三次握手相關
Client ------------------------- Server
SYN
SYN+ACK
ACK
1. 抵禦SYN 洪水***
SYN***是利用TCP/IP協議3次握手的原理,發送大量的建立連接的網絡包SYN包,但不實際建立連接, 最終導致被***服務器的網絡隊列被佔滿,無法被正常用戶訪問。
原理圖:
SYN Flood是當前最流行的DoS(拒絕服務***)不DDoS(分佈式拒絕服務***)的方式之一,這是一
種利用TCP協議缺陷,發送大量僞造的TCP連接請求,常用假冒的IP或IP號段發來海量的請求連接的
第一 個握手包(SYN包),被***服務器迴應第二個握手包(SYN+ACK包),因爲對方是假冒IP,對
方永進 收不到包且不會迴應第三個握手包。導致被***服務器保持大量SYN_RECV狀態的“半連接”,
並且會重 試默認5次迴應第二個握手包,塞滿TCP等待連接隊列,資源耗盡(CPU滿負荷或內存不足),
讓正常的 業務請求連接不進來。
解決:
[root@xuegod63 ~]# vim /etc/sysctl.conf #在文件最後添加以下內容
net.ipv4.tcp_synack_retries = 0
net.ipv4.tcp_syn_retries = 0
net.ipv4.tcp_max_syn_backlog = 20480
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
fs.file-max = 819200
net.core.somaxconn = 65536
net.core.rmem_max = 1024123000
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 165536
net.ipv4.ip_local_port_range = 10000 65535
注:每臺服務器上線之前,都應該配置以上內核參數。
最重要參數: 註釋:
[root@xuegod63 ~]# cat /proc/sys/net/ipv4/tcp_synack_retries #最關鍵參數,默認爲5,修 改爲0 表示不要重發
net.ipv4.tcp_synack_retries = 0
1
#表示迴應第二個握手包(SYN+ACK包)給客戶端IP後,如果收不到第三次握手包(ACK包)後,不進 行重試,加快回收“半連接”,不要耗光資源。
#作爲服務端。迴應時,如果連接失敗,達到對應的失敗數後,停止發送synack包
第一個參數tcp_synack_retries = 0是關鍵,表示迴應第二個握手包(SYN+ACK包)給客戶端IP後,如 果收不到第三次握手包(ACK包)後,不進行重試,加快回收“半連接”,不要耗光資源。 不修改這個參數,模擬***,10秒後被***的80端口即無法服務,機器難以ssh登錄; 用命令
netstat -na |grep SYN_RECV檢測“半連接”hold住180秒;
修改這個參數爲0的副作用:網絡狀況很差時,如果對方沒收到第二個握手包,可能連接服務器失敗,但對 於一般網站,用戶刷新一次頁面即可。這些可以在高峯期或網絡狀況不好時tcpdump抓包驗證下。 根據以前的抓包經驗,這種情況很少,但爲了保險起見,可以只在被tcp洪水***時臨時啓用這個參數。
tcp_synack_retries默認爲5,表示重發5次,每次等待30~40秒,即“半連接”默認hold住大約180秒。 我們之所以可以把tcp_synack_retries改爲0,因爲客戶端還有tcp_syn_retries參數,默認是5,即使服 務器端沒有重發SYN+ACK包,客戶端也會重發SYN握手包。
[root@xuegod63 ~]# cat /proc/sys/net/ipv4/tcp_syn_retries
0
#tcp_syn_retries參數,默認是5,當沒有收到服務器端的SYN+ACK包時,客戶端重發SYN握手包的次 數。
[root@xuegod63 ~]# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
20480
#半連接隊列長度,增加SYN隊列長度到20480:加大SYN隊列長度可以容納更多等待連接的網絡連接數, 具體多少數值受限於內存。
接下來輔助參數:
#系統允許的文件句柄的最大數目,因爲連接需要佔用文件句柄
fs.file-max = 819200
#用來應對突發的大併發connect 請求
net.core.somaxconn = 65536
#最大的TCP 數據發送緩衝(字節)
net.core.wmem_max = 16777216
#網絡設備接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目
net.core.netdev_max_backlog = 165536
#本機主動連接其他機器時的端口分配範圍,比如說,在vsftpd主動模式會用到 net.ipv4.ip_local_port_range = 10000 65535
注:如果只是開啓22端口,是不會使用到ip_local_port_range這個功能
[root@xuegod63 ~]# netstat -antup | grep :22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
1993/sshd
tcp 0 0 192.168.1.63:22 192.168.1.23:51855
ESTABLISHED 9316/sshd
tcp 0 0 192.168.1.63:22 192.168.1.23:51861
ESTABLISHED 10878/sshd
爲了處理大量連接,還需改大另外兩個參數: 限制用戶資源配置文件:/etc/security/limits.conf
[root@xuegod63 ~]#vim /etc/security/limits.conf #在最添加:
* soft nofile 1024000
* hard nofile 1024000
例 2:nproc #用戶可以打開的最大進程數
[root@xuegod63 ~]# vim /etc/security/limits.d/90-nproc.conf #RHEL6 必須這個文件中配 置
改:
* soft nproc 10240
爲:
* soft nproc 66666
* hard nproc 66666 [root@xuegod63 ~]# reboot #最好重啓一下
次要輔助參數,以上還無法解決syn洪水***,把以下內核參數關閉: 注意,以下參數面對外網時,不要打開。因爲副作用很明顯。
[root@xuegod63 ~]# cat /proc/sys/net/ipv4/tcp_syncookies
1
#表示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookies接收溢出的SYN連接,可防範少量
SYN***,默認爲0,表示關閉;
[root@xuegod63 ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse
1
#表示開啓tcp鏈接重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認爲0,表示關閉,現 在開啓,改爲1
[root@xuegod63 ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle
1
#表示開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。現在改爲1,表示開啓
[root@xuegod63 ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
30
#默認值是 60,對於本端斷開的socket連接,TCP保持在FIN_WAIT_2狀態的時間。
內網提速之巨幀Jumbo Frame
[root@xuegod63 ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:12:EC:1E
inet addr:192.168.1.63 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe12:ec1e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
實例:調大MTU
[root@xuegod63 ~]# ifconfig eth0 mtu 9000
[root@xuegod63 ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:12:EC:1E
inet addr:192.168.1.63 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe12:ec1e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9000 Metric:1 注:MTU,即Maximum Transmission Unit(最大傳輸單元),
此值設定TCP/IP協議傳輸數據報時的最 大傳輸單元。 系統不ISP之間MTU的不符就會直接導致數據在網絡傳輸過程中不斷地進行分包、組包,
浪費了寶貴的傳 輸時間,也嚴重影響了寬帶的工作效率。