高並發下linux內核優化


用vim打開配置文件:#vim /etc/sysctl.conf

在這個文件中,加入下面的幾行內容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

輸入下面的命令,讓內核參數生效:#sysctl -p

net.ipv4.tcp_syncookies = 1

 

#表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1
#表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1
#表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉;
net.ipv4.tcp_fin_timeout
#修改系統默認的 TIMEOUT 時間。

在經過這樣的調整之后,除了會進一步提升服務器的負載能力之外,還能夠防御小流量程度的DoS、CC和SYN攻擊。

此外,如果你的連接數本身就很多,我們可以再優化一下TCP的可使用端口范圍,進一步提升服務器的並發能力。依然是往上面的參數文件中,加入下面這些配置:
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000

#這幾個參數,建議只在流量非常大的服務器上開啟,會有顯著的效果。一般的流量小的服務器上,沒有必要去設置這幾個參數。

net.ipv4.tcp_keepalive_time = 1200
#表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改為20分鍾。
net.ipv4.ip_local_port_range = 10000 65000
#表示用於向外連接的端口范圍。缺省情況下很小:32768到61000,改為10000到65000。(注意:這里不要將最低值設的太低,否則可能會占用掉正常的端口!)
net.ipv4.tcp_max_syn_backlog = 8192
#表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網絡連接數。
net.ipv4.tcp_max_tw_buckets = 6000
#表示系統同時保持TIME_WAIT的最大數量,如果超過這個數字,TIME_WAIT將立刻被清除並打印警告信息。默 認為180000,改為6000。對於Apache、Nginx等服務器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對於Squid,效果卻不大。此項參數可以控制TIME_WAIT的最大數量,避免Squid服務器被大量的TIME_WAIT拖死。

內核其他TCP參數說明:
net.ipv4.tcp_max_syn_backlog = 65536
#記錄的那些尚未收到客戶端確認信息的連接請求的最大值。對於有128M內存的系統而言,缺省值是1024,小內存的系統則是128。
net.core.netdev_max_backlog = 32768
#每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。
net.core.somaxconn = 32768
#web應用中listen函數的backlog默認會給我們內核參數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認為511,所以有必要調整這個值。

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216           #最大socket讀buffer,可參考的優化值:873200
net.core.wmem_max = 16777216           #最大socket寫buffer,可參考的優化值:873200
net.ipv4.tcp_timestsmps = 0
#時間戳可以避免序列號的卷繞。一個1Gbps的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓內核接受這種“異常”的數據包。這里需要將其關掉。
net.ipv4.tcp_synack_retries = 2
#為了打開對端的連接,內核需要發送一個SYN並附帶一個回應前面一個SYN的ACK。也就是所謂三次握手中的第二次握手。這個設置決定了內核放棄連接之前發送SYN+ACK包的數量。
net.ipv4.tcp_syn_retries = 2
#在內核放棄建立連接之前發送SYN包的數量。
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1
# 開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接。

net.ipv4.tcp_wmem = 8192 436600 873200
# TCP寫buffer,可參考的優化值: 8192 436600 873200
net.ipv4.tcp_rmem  = 32768 436600 873200
# TCP讀buffer,可參考的優化值: 32768 436600 873200
net.ipv4.tcp_mem = 94500000 91500000 92700000
# 同樣有3個值,意思是:
net.ipv4.tcp_mem[0]:低於此值,TCP沒有內存壓力。
net.ipv4.tcp_mem[1]:在此值下,進入內存壓力階段。
net.ipv4.tcp_mem[2]:高於此值,TCP拒絕分配socket。
上述內存單位是頁,而不是字節。可參考的優化值是:786432 1048576 1572864

net.ipv4.tcp_max_orphans = 3276800
#系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上。
如果超過這個數字,連接將即刻被復位並打印出警告信息。
這個限制僅僅是為了防止簡單的DoS攻擊,不能過分依靠它或者人為地減小這個值,
更應該增加這個值(如果增加了內存之后)。
net.ipv4.tcp_fin_timeout = 30
#如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。對端可以出錯並永遠不關閉連接,甚至意外當機。缺省值是60秒。2.2 內核的通常值是180秒,你可以按這個設置,但要記住的是,即使你的機器是一個輕載的WEB服務器,也有因為大量的死套接字而內存溢出的風險,FIN- WAIT-2的危險性比FIN-WAIT-1要小,因為它最多只能吃掉1.5K內存,但是它們的生存期長些。

 

 

 

其他:

清理內存:

 

可以定時去清理緩存
echo 1 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches  這個清理掉更徹底

---------------------------------我是分割線,以下為姓張大佬給的優化建議----------------------------------------------------
初始化系統配置
cat /etc/redhat-release 看版本
uname -r 看內核
配置網絡IP    /etc/sysconfig/network-scripts/ifcfg-eth1
配置dns /etc/resolv.conf
配置hosts /etc/hosts 
配置主機名 /etc/sysconfig/network 
配置掛載文件 /etc/fstab
配置磁盤 
fdisk /dev/xvdb -> n -> p -> 1 -> 回車 -> 回車 -> w
echo '/dev/xvdb1  /data  ext4  defaults  0 0' >> /etc/fstab
mkfs.ext4 /dev/xvdb1
mount -a 掛載所有分區 
df -hT 查看
配置超時時間
echo 'TMOUT=1800' >> /etc/profile && . /etc/profile
安裝必要的軟件  
yum install -y sysstat lrzsz
yum groupinstall -y 'Development Tools'
#yum groupinstall -y 'x software development' 已棄

設定服務器中文   

echo 'LANG="zh_CN.UTF-8"' > /etc/sysconfig/i18n  
source /etc/sysconfig/i18n

同步時間  
*/30 * * * * /usr/sbin/ntpdate pool.ntp.org > /dev/null 2>&1

系統優化細節
1.禁止root登錄 改端口
PermiteMPTYpASSWORDS no #不允許空密碼
Port 22022
PermitRootLogin no #不允許root登錄
UseDNS no #不使用dns解析
2.創建共用賬號,然后用key文件登錄,不告訴其密碼
TestBusinessUser
3.yum 源改為國內,推薦阿里YuM源,epel擴展源也用阿里 [epel.repo | CentOS-Base.repo]

4.開啟防火牆   service iptables start
cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Fri Apr 22 10:57:48 2016
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:140]
:syn-flood - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22022 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
-A INPUT -p icmp -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
-A INPUT -p icmp -m limit --limit 1/sec --limit-burst 10 -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN
-A syn-flood -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j DROP
COMMIT

# Completed on Fri Apr 22 10:57:48 2016






5.關閉sexlinux    臨時關閉:setenforce 0
sed -i 's/SELINUX=enforcing/Selinux=disabled/' /etc/selinux/config     


6.設定運行級別為3   
sed -i 's/id:5:initdefault:/id:3:initdefault:' /etc/inittab


7.關閉不必要的隨機啟動項,保留必要的    

aegis | agentwatch | iptables | crond | network | ntpd | rsyslog | sshd 

8.visudo  
sudo授權BusinessSystem用戶,便於權限控制管理

9.sshd設置  

11.文件描述符加大  查看 ulimit -n 

echo '*    -    nofile    65535' > /etc/security/limits.conf 
echo 'ulimit -HSn 65535' >> /etc/rc.local
echo 'ulimit -s 65535' >> /etc/rc.local


12.清理clientmqueue目錄垃圾文件防止占滿磁盤空間 var目錄有大量的日志文件  尤其是郵件服務產生的大量沒用日志
find /var/spool/clientmqueue  -type f | xargs rm -f
可以設置每周六凌晨清理     echo '00 00 * * 6 /bin/bash /data/script/clientmqueue.sh > /dev/null 2>&1'


13.調整內核參數文件,web服務必須優化,提高並發

cat /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
kernel.exec-shield = 1
kernel.randomize_va_space = 1
fs.file-max = 65535
kernel.pid_max = 65536
net.core.netdev_max_backlog = 4096
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_max_tw_buckets = 4096
net.ipv4.tcp_keepalive_time = 20
net.ipv4.ip_forward = 0
net.ipv4.tcp_mem = 192000 300000 732000
net.ipv4.tcp_rmem = 51200 131072 204800
net.ipv4.tcp_wmem = 51200 131072 204800
net.ipv4.tcp_keepalive_intvl = 5
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_orphans = 2000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
vm.min_free_kbytes=409600
vm.vfs_cache_pressure=200
vm.swappiness = 40
vm.dirty_expire_centisecs = 1500
vm.dirty_writeback_centisecs = 1000
vm.dirty_ratio = 2
vm.dirty_background_ratio = 100
運行sysctl -p 啟用內核配置

14.目錄結構整理,所有第三方文件,都安裝到/data/ 目錄下
data目錄一定不要用系統盤,單獨用數據盤

15.如果可能,把必要的系統文件鎖定,及時黑進來也改不了關鍵文件
   但是要慎用,修改系統文件要記得 修改之前一定要備份
   chattr +i /etc/group 不允許添加用戶
   chattr +i /etc/inittab 
   chattr +i /etc/shadow 不允許修改密碼
   chattr +i /etc/rc.local 

16.隱藏服務器版本信息  cp /etc/issue /etc/issue.base
cat /dev/null > /etc/issue

17.全面中文支持
[xxx@iZ23cwcora9Z ~]$ locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=

18.參考資料:http://lovers.blog.51cto.com/5850489/1585178

# innodb config
#innodb_data_file_path = ibdata1:50M;ibdata2:50M:autoextend:max:500M
# Set buffer pool size to 50-80% of your computer's memory
innodb_buffer_pool_size = 2G
innodb_additional_mem_pool = 16M
# Set the log file size to about 25% of the buffer pool size
innodb_log_file_size = 512M
innodb_log_files_in_group = 2
# innodb_log_buffer_size set 2-8M
innodb_log_buffer_size = 3M
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 50
innodb_file_per_table = 1
innodb_open_files = 800
innodb_flush_method = O_DIRECT
innodb_max_dirty_pages_pct = 90
lower_case_table_names=1


skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 16M
table_open_cache = 64
sort_buffer_size = 1M
net_buffer_length = 8K
read_buffer_size = 1M
read_rnd_buffer_size = 512K
slave_skip_errors = all


wait_timeout = 240
interactive_timeout = 20
net_read_timeout = 20
net_write_timeout = 30
skip-name-resolve


max_connections = 2000
max_user_connections = 1000

https://blog.csdn.net/u013697959/article/details/77369931


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM