關于 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
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 上運作
[root@silence80 ~]# taskset -c 0 vim a.txt #1 号 CPU ID 是 0
[root@silence80 ~]# ps -axu | grep vim
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
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
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
[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
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、檢查:
1024000
[root@silence80 ~]# useradd mk #以普通使用者登入,測試
[root@silence80 ~]# su - mk
[silence@silence80 ~]$ ulimit -n
方法二:#臨時修改
[root@silence80 ~]# ulimit -n 10000
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
或:
再打一個終端,直接檢視
66666
臨時:
[root@silence80 ~]# ulimit -u 60000
60000
注:預設使用者可用的最大程序數量1024.這樣以silence80使用者啟動的程序就數就不能大于1024了。
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
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
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
#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 #在最添加:
[root@xuegod63 ~]# vim /etc/security/limits.d/90-nproc.conf #RHEL6 必須這個檔案中配 置
* hard nproc 66666 [root@xuegod63 ~]# reboot #最好重新開機一下
次要輔助參數,以上還無法解決syn洪水攻擊,把以下核心參數關閉: 注意,以下參數面對外網時,不要打開。因為副作用很明顯。
[root@xuegod63 ~]# cat /proc/sys/net/ipv4/tcp_syncookies
#表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies接收溢出的SYN連接配接,可防範少量
SYN攻擊,預設為0,表示關閉;
[root@xuegod63 ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse
#表示開啟tcp連結重用。允許将TIME-WAIT sockets重新用于新的TCP連接配接,預設為0,表示關閉,現 在開啟,改為1
[root@xuegod63 ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle
#表示開啟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
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
執行個體:調大MTU
[root@xuegod63 ~]# ifconfig eth0 mtu 9000
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的不符就會直接導緻資料在網絡傳輸過程中不斷地進行分包、組包,
浪費了寶貴的傳 輸時間,也嚴重影響了寬帶的工作效率。