linuxkeepalive
A. linux内核优化参数
cat >> /etc/sysctl.conf << EOF
# kernel optimization
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
EOF # 《Linux就该这么学》
将上面的内核参数加入/etc/sysctl.conf文件中,执行如下命令使之生效:
sysctl -p
B. linux keepalive超时时间设多长合适
// Get
#cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
#cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
#cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
// Set
#echo 1000> /proc/sys/net/ipv4/tcp_keepalive_time
#echo 50> /proc/sys/net/ipv4/tcp_keepalive_intvl
#echo 20> /proc/sys/net/ipv4/tcp_keepalive_probes
C. 一般优化linux的内核,需要优化什么参数
首先要知道一点所有的TCP/IP的参数修改是临时的,因为它们都位于/PROC/SYS/NET目录下,如果想使参数长期保存,可以通过编辑/ETC/SYSCTL.CONF文件来实现,这里不做详细说明,只针对Linux的TCPIP内核参数优化列举相关参数:
1、为自动调优定义socket使用的内存
2、默认的TCP数据接收窗口大小(字节)
3、最大的TCP数据接收窗口
4、默认的TCP发送窗口大小
5、最大的TCP数据发送窗口
6、在每个网络接口接收数据包的速率比内核处理这些包速率快时,允许送到队列的数据包最大数目
7、定义了系统中每一个端口最大的监听队列长度
8、探测消息未获得相应时,重发该消息的间隔时间
9、在认定tcp连接失效之前,最多发送多少个keepalive探测消息等。
D. 一般优化linux的内核,需要优化什么参数
作为高性能WEB服务器,只调整Nginx本身的参数是不行的,因为Nginx服务依赖于高性能的操作系统。
以下为常见的几个Linux内核参数优化方法。
net.ipv4.tcp_max_tw_buckets
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_syn_retries
net.ipv4.tcp_synack_retries
net.ipv4.ip_local_port_range
net.ipv4.tcp_fin_timeout
net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
对于tcp连接,服务端和客户端通信完后状态变为timewait,假如某台服务器非常忙,连接数特别多的话,那么这个timewait数量就会越来越大。
毕竟它也是会占用一定的资源,所以应该有一个最大值,当超过这个值,系统就会删除最早的连接,这样始终保持在一个数量级。
这个数值就是由net.ipv4.tcp_max_tw_buckets这个参数来决定的。
CentOS7系统,你可以使用sysctl -a |grep tw_buckets来查看它的值,默认为32768,
你可以适当把它调低,比如调整到8000,毕竟这个状态的连接太多也是会消耗资源的。
但你不要把它调到几十、几百这样,因为这种状态的tcp连接也是有用的,
如果同样的客户端再次和服务端通信,就不用再次建立新的连接了,用这个旧的通道,省时省力。
该参数的作用是快速回收timewait状态的连接。上面虽然提到系统会自动删除掉timewait状态的连接,但如果把这样的连接重新利用起来岂不是更好。
所以该参数设置为1就可以让timewait状态的连接快速回收,它需要和下面的参数配合一起使用。
该参数设置为1,将timewait状态的连接重新用于新的TCP连接,要结合上面的参数一起使用。
tcp三次握手中,客户端向服务端发起syn请求,服务端收到后,也会向客户端发起syn请求同时连带ack确认,
假如客户端发送请求后直接断开和服务端的连接,不接收服务端发起的这个请求,服务端会重试多次,
这个重试的过程会持续一段时间(通常高于30s),当这种状态的连接数量非常大时,服务器会消耗很大的资源,从而造成瘫痪,
正常的连接进不来,这种恶意的半连接行为其实叫做syn flood攻击。
设置为1,是开启SYN Cookies,开启后可以避免发生上述的syn flood攻击。
开启该参数后,服务端接收客户端的ack后,再向客户端发送ack+syn之前会要求client在短时间内回应一个序号,
如果客户端不能提供序号或者提供的序号不对则认为该客户端不合法,于是不会发ack+syn给客户端,更涉及不到重试。
该参数定义系统能接受的最大半连接状态的tcp连接数。客户端向服务端发送了syn包,服务端收到后,会记录一下,
该参数决定最多能记录几个这样的连接。在CentOS7,默认是256,当有syn flood攻击时,这个数值太小则很容易导致服务器瘫痪,
实际上此时服务器并没有消耗太多资源(cpu、内存等),所以可以适当调大它,比如调整到30000。
该参数适用于客户端,它定义发起syn的最大重试次数,默认为6,建议改为2。
该参数适用于服务端,它定义发起syn+ack的最大重试次数,默认为5,建议改为2,可以适当预防syn flood攻击。
该参数定义端口范围,系统默认保留端口为1024及以下,以上部分为自定义端口。这个参数适用于客户端,
当客户端和服务端建立连接时,比如说访问服务端的80端口,客户端随机开启了一个端口和服务端发起连接,
这个参数定义随机端口的范围。默认为32768 61000,建议调整为1025 61000。
tcp连接的状态中,客户端上有一个是FIN-WAIT-2状态,它是状态变迁为timewait前一个状态。
该参数定义不属于任何进程的该连接状态的超时时间,默认值为60,建议调整为6。
tcp连接状态里,有一个是established状态,只有在这个状态下,客户端和服务端才能通信。正常情况下,当通信完毕,
客户端或服务端会告诉对方要关闭连接,此时状态就会变为timewait,如果客户端没有告诉服务端,
并且服务端也没有告诉客户端关闭的话(例如,客户端那边断网了),此时需要该参数来判定。
比如客户端已经断网了,但服务端上本次连接的状态依然是established,服务端为了确认客户端是否断网,
就需要每隔一段时间去发一个探测包去确认一下看看对方是否在线。这个时间就由该参数决定。它的默认值为7200秒,建议设置为30秒。
该参数和上面的参数是一起的,服务端在规定时间内发起了探测,查看客户端是否在线,如果客户端并没有确认,
此时服务端还不能认定为对方不在线,而是要尝试多次。该参数定义重新发送探测的时间,即第一次发现对方有问题后,过多久再次发起探测。
默认值为75秒,可以改为3秒。
第10和第11个参数规定了何时发起探测和探测失败后再过多久再发起探测,但并没有定义一共探测几次才算结束。
该参数定义发起探测的包的数量。默认为9,建议设置2。
设置和范例
在Linux下调整内核参数,可以直接编辑配置文件/etc/sysctl.conf,然后执行sysctl -p命令生效
E. linux瓒呮椂阃鍑鸿剧疆linux瓒呮椂
linux鐪嬮棬镫楄秴镞剁郴缁熶笉鏂閲嶅惎锛
闾f槸浣犵殑鍐呮牳链夐梾棰樸
鎹涓鐗堟湰鎶娿傚傛灉鏄浣犺嚜宸辫佸壀镄勫唴镙革纴鐪嬬湅鏄涓嶆槸娌℃湁锽傜嫍銆傛垨钥呯矖𨱌寸偣鐩存帴绂佺敤鐪嬮棬镫椼socketsend镐绘槸瓒呮椂浠涔埚师锲狅纻
linux鍜寃indows涓嬬敤setsockopt璁剧疆SO_SNDTIMEO,SO_RCVTIMEO镄勫弬鏁扮殑涓镣瑰尯鍒玌DP镄剆ocket鍦ㄦ煇浜涙儏鍐碉细
濡傚规柟鍏抽棴镞讹纴链鍦板彲鑳絪endto涓嶅嚭铡绘暟鎹锛岀劧钖巖ecvfrom灏变细琚阒诲烇纴杩欐椂灏遍渶瑕佽剧疆杩欎袱涓鍙傛暟镄勫兼彁楂樼▼搴忚川閲忋俵inux:structtimevaltimeout={3,0}
;//3sintret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,(constchar*)timeout,sizeof(timeout))
;intret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,(constchar*)timeout,sizeof(timeout))
;濡傛灉ret==0鍒欎负鎴愬姛,-1涓哄け璐,杩欐椂鍙浠ユ煡鐪媏rrno𨱒ュ垽鏂澶辫触铡熷洜intrecvd=recv(sock_fd,buf,1024,0)
;if(recvd==-1errno==EAGAIN){printf(timeoutn);
}windows:inttimeout=3000;//3sintret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,timeout,sizeof(timeout))
;intret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,timeout,sizeof(timeout));钥宻olaris锛屽垯涓嶆敮鎸併
linux链澶х鍙f暟瓒呰繃65535镐庝箞锷烇纻
瑕佸垎娓呯鍙f暟鍜岃繛鎺ユ暟锛
纭瀹烇纴鐢佃剳鍙寮绔鍙f暟鍙链65536涓锛屽崰婊′简灏辨病寰楀紑浜嗭纴杩欐槸浜嫔疄銆备絾杩橀渶瑕佹敞镒忕殑鏄锛氱鍙d笉鏄璇村崰鐢ㄤ简灏变竴鐩存槸浣犵殑浜嗭纴浣犱笉鐢ㄤ简杩桦彲浠ラ喷鏀撅纴閲婃斁钖庡埆镄勭▼搴忚缮鑳芥帴镌浣跨敤锛屾墍浠ワ纴锷ㄦ佸埄鐢ㄤ箣涓嬶纴寰堥毦鎶婄鍙e崰瀹岀殑銆
鍏朵簩銆佽佸垎娓呯鍙e拰杩炴帴銆备竴涓绔鍙e彲浠ユ湁鑻ュ共涓杩炴帴锛屽俷ginx锛屾櫘阃歭inux涓婏纴涓涓80绔鍙e氨鑳藉苟鍙10涓+镄勮繛鎺ワ纴鏋侀檺𨱍呭喌涓嬶纴鍙浠ヨ繎锏句竾銆傛墍浠ワ纴鐢变簬绔鍙e岖敤锛屽叾瀹炲苟涓崭细鐢ㄥ埌闾d箞澶氱鍙c
镓浠ワ纴65536涓绔鍙g敤瀹岀殑绁炶瘽锘烘湰涓娄笉浼氩嚭鐜般
瓒呮椂鍙栨秷璁㈠崟镐庝箞澶勭悊锛
1.瀹氭椂杞璇
链绠鍗旷殑鏂规硶锛屽啓濂藉彇娑堣㈠崟镄勯昏緫锛屼竴鑸鏄鍙栬㈠崟琛ㄥ緟浠樻剧姸镐佺殑璁㈠崟锛岀劧钖庡仛阆嶅巻鍙栨秷澶勭悊锛屼娇鐢↙inux绯荤粺镄刢rontab瀹氭椂镓ц屽彇娑堣㈠崟锷熻兘銆
浼樼偣锛氱亩鍗曞揩鎹凤纴涓氩姟灏忕殑鍙浠ヨ冭槛
缂虹偣锛
鐢变簬Linux镄勯檺鍒讹纴鍙鑳界簿纭鍒扮
杞璇㈤戠巼涓嶈兘镊涓绘带鍒讹纴濡傛灉杩愮淮鍜屽紑鍙戝垎寮绠$悊锛屾疮娆¤皟鏁撮渶瑕佽繍缁撮厤缃淇鏀
濡傛灉绗涓娆¤疆璇㈣楁椂闀匡纴绗浜屾¤疆璇㈠张寮濮嬩简锛屼细阃犳垚浠诲姟閲嶅嶆墽琛
鍗犵敤鏁版嵁搴撹祫婧
涓嶈兘骞跺彂镓ц
2.浠诲姟璋冨害
涓浜泈eb妗嗘灦浼氩甫链変换锷¤皟搴︾殑锷熻兘锛屽儚php镄凩aravel妗嗘灦銆
浼樼偣锛
杞璇㈤戠巼鍙浠ュ仛鍒扮敤浠g爜𨱒ユ带鍒讹纴涓嶅畬鍏ㄤ緷璧栫郴缁燂绂
浠诲姟鍙浠ュ仛鍒颁笉閲嶅嶆墽琛
缂虹偣锛氲窡瀹氭椂杞璇㈠樊涓嶅
3.寤惰繜阒熷垪澶勭悊
濡傛灉绯荤粺链夊お澶氱殑璁㈠崟闇瑕佸勭悊锛岄偅涔埚勭悊镄勬椂闂村氨瑕佸緢闀匡纴锅囧傜涓娆¤疆璇㈣缮娌$粨𨱒燂纴绗浜屾″张寮濮嬩简锛屽氨浼氶犳垚浠诲姟镄勯吨澶嶆墽琛岋纴钖屾椂鎶戝埗鍗犵敤鏁版嵁搴撹祫婧愶纴阃犳垚鏁版嵁搴揿帇锷涘ぇ锛岀敤寤惰繜阒熷垪锅氩彇娑堣㈠崟澶勭悊锛岃惧畾寤惰繜镞堕棿涓烘彁浜よ㈠崟涔嫔悗镄30鍒嗛挓镓ц岋纴鏁堢巼浼氶珮寰埚氾纴甯哥敤镄勫欢镞堕槦鍒楁湁
redis锛堣㈤槄阌镄勫け鏁堜簨浠讹级
妗嗘灦镊甯︾殑阒熷垪锛堜緥濡侺aravel妗嗘灦镊甯︾殑阒熷垪锛
rabbitMQ寤惰繜阒熷垪
浼樼偣锛
涓嶉渶瑕佸硅㈠崟琛ㄨ疆璇㈠勭悊锛屽噺灏戞暟鎹搴揿帇锷
涓崭细閲嶅嶆墽琛
鏁堢巼楂
鍙閰嶅悎澶氱嚎绋嫔勭悊
涓氩姟閲忓ぇ镄勬柟渚垮仛闆嗙兢
涓崭緷璧栫郴缁熺殑crontab
PLSql阈炬帴鏁版嵁搴揿脊鍑洪摼鎺ヨ秴镞讹纴璇ユ庝箞锷烇纻
澶氲凤纴闄や简涓妤煎垪涓剧殑妫镆ュ唴瀹瑰栵纴杩樿佹镆ヤ互涓嫔唴瀹癸细
1)锛氩傛灉鍏鍙告湁阒茬伀澧欙纴闇瑕佹镆ラ槻𨱔澧欑殑瓒呮椂璁剧疆锛
2)锛氩傛灉鎭ㄧ殑鏁版嵁搴揿湪Linux/Uinx鐜澧冿纴闇瑕佹镆ョ浉鍏砶eepalive鍙傛暟镄勮剧疆𨱍呭喌銆
F. 鍦↙inux涓镓揿紑浜嗗お澶氭枃浠剁殑涓夌嶈В鍐虫柟娉
锲炵瓟涓銆
[root@lxadmin nginx]# cat /proc/sys/fs/file-max
8192
鏂囦欢绯荤粺链澶у彲镓揿紑鏂囦欢鏁
[root@lxadmin nginx]# ulimit -n
1024
绋嫔簭闄愬埗鍙鑳芥墦寮1024涓鏂囦欢
浣跨敤[root@lxadmin nginx]# ulimit -n 8192璋冩暣涓涓
鎴栬呮案涔呰皟鏁存墦寮鏂囦欢鏁 鍙鍦ㄥ惎锷ㄦ枃浠/etc/rc.d/rc.local链灏炬坊锷狅纸鍦/etc/sysctl.conf链灏炬坊锷爁s.file-max=xxx镞犳晥锛
ulimit -n 8192
锲炵瓟浜屻
Linux鍐呮牳链夋椂浼氭姤锻娾淭oo many open files钬濓纴璧峰洜鏄痜ile-max榛樿ゅ硷纸8096锛夊お灏忋傝佽В鍐宠繖涓闂棰桡纴鍙浠root韬浠芥墽琛屼笅鍒楀懡浠わ纸鎴栧皢瀹冧滑锷犲叆/etc/rcS.d/*涓嬬殑init鑴氭湰銆傦级
# echo "65536" /proc/sys/fs/file-max # 阃傜敤浜2.2鍜2.4鐗埚唴镙
# echo "131072" /proc/sys/fs/inode-max # 浠呴傜敤浜2.2鐗埚唴镙
锲炵瓟涓夈
锷炴硶鏄淇鏀规搷浣灭郴缁熺殑镓揿紑鏂囦欢鏁伴噺闄愬埗锛屾柟娉曞备笅锛
1. 鎸夌収链澶ф墦寮鏂囦欢鏁伴噺镄勯渶姹傝剧疆绯荤粺锛 骞朵笖阃氲繃妫镆/proc/sys/fs/file-max鏂囦欢𨱒ョ‘璁ゆ渶澶ф墦寮鏂囦欢鏁板凡缁忚姝g‘璁剧疆銆
# cat /proc/sys/fs/file-max
濡傛灉璁剧疆鍊煎お灏忥纴 淇鏀规枃浠/etc/sysctl.conf镄勫彉閲忓埌钖堥傜殑鍊笺 杩欐牱浼氩湪姣忔¢吨钖涔嫔悗鐢熸晥銆 濡傛灉璁剧疆鍊煎熷ぇ锛岃烦杩囦笅姝ャ
# echo 2048 /proc/sys/fs/file-max
缂栬緫鏂囦欢/etc/sysctl.conf锛屾彃鍏ヤ笅琛屻
fs.file-max = 8192
2. 鍦/etc/security/limits.conf鏂囦欢涓璁剧疆链澶ф墦寮鏂囦欢鏁帮纴 涓嬮溃鏄涓琛屾彁绀猴细
#
娣诲姞濡备笅杩栾屻
* - nofile 8192
杩栾岃剧疆浜嗘疮涓鐢ㄦ埛镄勯粯璁ゆ墦寮鏂囦欢鏁颁负2048銆 娉ㄦ剰"nofile"椤规湁涓や釜鍙鑳界殑闄愬埗鎺鏂姐傚氨鏄椤逛笅镄删ard鍜宻oft銆 瑕佷娇淇鏀硅繃寰楁渶澶ф墦寮鏂囦欢鏁扮敓鏁堬纴蹇呴’瀵硅繖涓ょ嶉檺鍒惰繘琛岃惧畾銆 濡傛灉浣跨敤"-"瀛楃﹁惧畾, 鍒檋ard鍜宻oft璁惧畾浼氩悓镞惰璁惧畾銆
纭闄愬埗琛ㄦ槑soft闄愬埗涓镓鑳借惧畾镄勬渶澶у笺 soft闄愬埗鎸囩殑鏄褰揿墠绯荤粺鐢熸晥镄勮剧疆鍊笺 hard闄愬埗鍊煎彲浠ヨ鏅阃氱敤鎴烽檷浣庛备絾鏄涓嶈兘澧炲姞銆 soft闄愬埗涓嶈兘璁剧疆镄勬瘆hard闄愬埗镟撮珮銆 鍙链塺oot鐢ㄦ埛镓嶈兘澶熷炲姞hard闄愬埗鍊笺
褰揿炲姞鏂囦欢闄愬埗鎻忚堪锛屽彲浠ョ亩鍗旷殑鎶婂綋鍓嶅煎弻鍊嶃 渚嫔瓙濡备笅锛 濡傛灉浣犺佹彁楂橀粯璁ゅ1024锛 链濂芥彁楂桦埌2048锛 濡傛灉杩樿佺户缁澧炲姞锛 灏遍渶瑕佽剧疆鎴4096銆
鍙﹀栦竴绉嶆儏鍐垫槸鍦ㄥ垱寤虹储寮旷殑镞跺欙纴涔熸湁涓ょ嶅彲鑳斤纴涓绉嶆槸 钖埚苟锲犲瓙澶灏忥纴瀵艰嚧鍒涘缓鏂囦欢鏁伴噺瓒呰繃镎崭綔绯荤粺闄愬埗锛岃繖镞跺彲浠ヤ慨鏀瑰悎骞跺洜瀛愶纴涔熷彲浠ヤ慨鏀规搷浣灭郴缁熺殑镓揿紑鏂囦欢鏁伴檺鍒讹绂鍙﹀栦竴绉嶆槸钖埚苟锲犲瓙鍙楄櫄𨰾熸満鍐呭瓨镄勯檺鍒讹纴镞犳硶璋冩暣鍒版洿澶э纴钥 闇瑕佺储寮旷殑doc 鏁伴噺鍙堥潪甯哥殑澶э纴杩欎釜镞跺椤氨鍙鑳介氲繃淇鏀规搷浣灭郴缁熺殑镓揿紑鏂囦欢鏁伴檺鍒舵潵瑙e喅浜嗐
鍦ㄦゅ熀纭涓婏纴鎴戣缮淇鏀逛简浠ヤ笅涓涓閰岖疆鏂囦欢
vi /etc/sysctl.conf
娣诲姞锛
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 30
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# Turn off tcp_window_scaling
net.ipv4.tcp_window_scaling = 0
# Turn off the tcp_sack
net.ipv4.tcp_sack = 0
#Turn off tcp_timestamps
net.ipv4.tcp_timestamps = 0
铹跺悗 service network restart,杩欎簺閮藉拰TCP sockets链夊叧镄勪紭鍖栥
鍙﹀栭渶瑕佸湪 /etc/rc.d/rc.local閲屾坊锷犲凡浣垮缑閲嶅惎镄勬椂鍊欑敓鏁堛
echo "30"/proc/sys/net/ipv4/tcp_fin_timeout
echo "1800"/proc/sys/net/ipv4/tcp_keepalive_time
echo "0"/proc/sys/net/ipv4/tcp_window_scaling
echo "0"/proc/sys/net/ipv4/tcp_sack
echo "0"/proc/sys/net/ipv4/tcp_timestamps
锲犱负涓嶆槸镓链夌殑绋嫔簭閮藉湪root涓嬭窇镄勶纴镓链塴inux链夊筯ard 涓巗oft open files 镄勫尯鍒嗭纴鏅阃氱敤鎴峰弹hard镄勯檺鍒讹纴镞犺簎limit -n $鏁板艰皟鍒板氶珮锛岄兘璺戜笉鍒 /etc/security/limits.conf閲宯ofile镄勫.
杩欐牱镄勪紭鍖栧悗 lsof -p $java_pid|wc -l鍙浠ヨ窇鍒4鍗冧互涓婇兘涓崭细鎶涘嚭too many open files銆傝阿璋㈤槄璇伙纴甯屾湜鑳藉府鍒板ぇ瀹讹纴璇风户缁鍏虫敞鑴氭湰涔嫔讹纴鎴戜滑浼氩姫锷涘垎浜镟村氢紭绉镄勬枃绔犮