linux調優

關於 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) 這個項就可以了

wKioL1XHYZuCABtbAAIxy80MBaQ665.jpg

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都橋接 添加網卡:

wKiom1XHXUbgnqntAAHtJg-X_vw506.jpg

配置:

查看是否加載了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   #查看網關

wKiom1XHXzvC2rpwAAFaLg-qnBk502.jpg

[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包,但不實際建立連接, 最終導致被***服務器的網絡隊列被佔滿,無法被正常用戶訪問


原理圖:

wKioL1XHYmmTHv3-AAH5rWNxo1g308.jpg

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的不符就會直接導致數據在網絡傳輸過程中不斷地進行分包、組包,

浪費了寶貴的傳 輸時間,也嚴重影響了寬帶的工作效率。





























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章