‘壹’ 查看linux中的TCP连接数
1)统计80端口连接数
2)统计httpd协议连接数
3)、统计已连接上的,状态为“established
4)、查出哪个IP地址连接最多,将其封了.
1、查看apache当前并发访问数:
对比httpd.conf中MaxClients的数字差距多少。
2、查看有多少个进程数:
3、可以使用如下参数查看数据
统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。
表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整。
4341
netstat -an会打印系统当前网络链接状态,而grep -i "80"是用来提取与80端口有关的连接的,wc -l进行连接数统计。
最终返回的数字就是当前所有80端口的请求总数。
netstat -an会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立连接的信息。 然后wc -l统计。
最终返回的数字就是当前所有80端口的已建立连接的总数。
查看Apache的并发请求数及其TCP连接状态:
TIME_WAIT 8947 等待足够的时间以确保远程TCP接收到连接中断请求的确认
FIN_WAIT1 15 等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN_WAIT2 1 从远程TCP等待连接中断请求
ESTABLISHED 55 代表一个打开的连接
SYN_RECV 21 再收到和发送一个连接请求后等待对方对连接请求的确认
CLOSING 2 没有任何连接状态
LAST_ACK 4 等待原来的发向远程TCP的连接中断请求的确认
TCP连接状态详解
LISTEN: 侦听来自远方的TCP端口的连接请求
SYN-SENT: 再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED: 代表一个打开的连接
FIN-WAIT-1: 等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2: 从远程TCP等待连接中断请求
CLOSE-WAIT: 等待从本地用户发来的连接中断请求
CLOSING: 等待远程TCP对连接中断的确认
LAST-ACK: 等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT: 等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED: 没有任何连接状态
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
其中的
SYN_RECV表示正在等待处理的请求数;
ESTABLISHED表示正常数据传输状态;
TIME_WAIT表示处理完毕,等待超时结束的请求数。
查看Apache并发请求数及其TCP连接状态
查看httpd进程数(即prefork模式下Apache能够处理的并发请求数):
返回结果示例:
1388
表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整,我这组服务器中每台的峰值曾达到过2002。
查看Apache的并发请求数及其TCP连接状态:
返回结果示例:
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。
状态:描述
CLOSED:无连接是活动 的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
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
然后执行 /sbin/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 时间
客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口
状态为TIME_WAIT
是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?
有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?
主动关闭的一方在发送最后一个 ack 后
就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间
这个是TCP/IP必不可少的,也就是“解决”不了的。
也就是TCP/IP设计者本来是这么设计的
主要有两个原因
1。防止上一次连接中的包,迷路后重新出现,影响新连接
(经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。
TIME_WAIT 并不会占用很大资源的,除非受到攻击。
还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态
如何合理设置apache httpd的最大连接数?
手头有一个网站在线人数增多,访问时很慢。初步认为是服务器资源不足了,但经反复测试,一旦连接上,不断点击同一个页面上不同的链接,都能迅速打开,这种现象就是说明apache最大连接数已经满了,新的访客只能排队等待有空闲的链接,而如果一旦连接上,在keeyalive 的存活时间内(KeepAliveTimeout,默认5秒)都不用重新打开连接,因此解决的方法就是加大apache的最大连接数。
1.在哪里设置?
apache 2.24,使用默认配置(FreeBSD 默认不加载自定义MPM配置),默认最大连接数是250
在/usr/local/etc/apache22/httpd.conf中加载MPM配置(去掉前面的注释):
Include etc/apache22/extra/httpd-mpm.conf
可见的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf,但里面根据httpd的工作模式分了很多块,哪一部才是当前httpd的工作模式呢?可通过执行 apachectl -l 来查看:
Compiled in moles:
core.c
prefork.c
http_core.c
mod_so.c
看到prefork 字眼,因此可见当前httpd应该是工作在prefork模式,prefork模式的默认配置是:
<IfMole mpm_prefork_mole>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfMole>
2.要加到多少?
连接数理论上当然是支持越大越好,但要在服务器的能力范围内,这跟服务器的CPU、内存、带宽等都有关系。
查看当前的连接数可以用:
ps aux | grep httpd | wc -l
或:
pgrep httpd|wc -l
计算httpd占用内存的平均数:
ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'
由于基本都是静态页面,CPU消耗很低,每进程占用内存也不算多,大约200K。
服务器内存有2G,除去常规启动的服务大约需要500M(保守估计),还剩1.5G可用,那么理论上可以支持1.5 1024 1024*1024/200000 = 8053.06368
约8K个进程,支持2W人同时访问应该是没有问题的(能保证其中8K的人访问很快,其他的可能需要等待1、2秒才能连上,而一旦连上就会很流畅)
控制最大连接数的MaxClients ,因此可以尝试配置为:
<IfMole mpm_prefork_mole>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500
MaxClients 5000
MaxRequestsPerChild 100
</IfMole>
注意,MaxClients默认最大为250,若要超过这个值就要显式设置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小于MaxClients,不然重启httpd时会有提示。
重启httpd后,通过反复执行pgrep httpd|wc -l 来观察连接数,可以看到连接数在达到MaxClients的设值后不再增加,但此时访问网站也很流畅,那就不用贪心再设置更高的值了,不然以后如果网站访问突增不小心就会耗光服务器内存,可根据以后访问压力趋势及内存的占用变化再逐渐调整,直到找到一个最优的设置值。
(MaxRequestsPerChild不能设置为0,可能会因内存泄露导致服务器崩溃)
更佳最大值计算的公式:
apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5
附:
实时检测HTTPD连接数:
watch -n 1 -d "pgrep httpd|wc -l"
‘贰’ c语言的recv()非阻塞方法怎么弄哦
需要将recv设置超时,Linux下设置超时如下:
//设置发送超时
struct timeval timeout={3,0};//3s
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
windows下设置超时如下:
int timeout = 3000; //3s
int ret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,&timeout,sizeof(timeout));
int ret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));
‘叁’ linux瓒呮椂镞堕棿璁剧疆linux瓒呮椂镞堕棿
linuxsocket榛樿よ秴镞舵椂闂达纻
涓句緥锛歴=socket();璁剧疆s涓簄on-blocking锛沜onnect(s,..);FD_SET...;rc=select(...,10s);if(rc==0)琛ㄧず10s瓒呮椂浜嗐傝繖涓瓒呮椂镄勬剰镐濇槸锛10s涔嫔唴锛宻elect涓镓链塻ocket镄勪簨浠跺潎链浜х敓锛埚傛灉镊冲皯链変竴涓浜х敓锛屽垯rc澶т簬0)娉ㄦ剰锛氲繖涓10s璺焎onnect链韬镄勮秴镞舵満鍒跺畬鍏ㄦ棤鍏筹纴鍓嶈呯殑璁剧疆涓嶅奖鍝嶅悗钥呫
10s钖巗elect镄勮繑锲烇纴琛ㄦ槑10s鍐卌onnect杩樻病鎴愬姛锛宑onnect鍙鑳借缮鍦ㄦ寜镊宸辩殑瓒呮椂链哄埗锛堜緥濡傛参钖锷锛夊皾璇曢吨杩烇纸褰撶劧瀹冩渶缁堜篃链変釜瓒呮椂锛夈
镊充簬connect链韬镄勮秴镞舵槸钖﹀彲浠ヨ剧疆锛屽彲鑳藉悇绯荤粺涓崭竴镙枫傞‘渚挎彁阅掞细connect镄剆ocket蹇呴’鏄痭on-blocking绫诲瀷锛屽惁鍒欙纴connect浼氶樆濉烇纴涔熷氨娌″繀瑕佺敤select𨱒ユ娴嬫槸钖﹁繛鎺ユ垚锷熴
鍙﹀栵纴闾d釜s瑕佹敞鍐屽埌write绫诲瀷镄刦d涓锛屽嵆select镄勭3涓鍙傛暟涓銆
鍏朵粬listen锛宺ecv浠涔堢殑锛屽畬鍏ㄧ被浼硷纸浣唋isten锛宺ecv链韬娌℃湁浠涔堣秴镞舵傚康锛夈
鍙涓嶈繃listen镄勫拰recv镄剆ocket锛岃佹敞鍐屽埌read镄刦d涓銆
濡备綍淇鏀筶inuxtcpestablished钥佸寲镞堕棿锛
1銆佷慨鏀筶inux绯荤粺涓嬬殑tcp_retries2涓1锛屽綋socket鍙戦侀槦鍒楁湁涓瀹氭暟鎹镞讹纴绐佺劧鍒囨柇缃戠嚎锛岄犳垚寮傚父鏂阈剧殑鍦烘櫙锛屾ゆ椂锛屽ぇ绾﹁繃浜1绉掞纴鐢╪etstat瑙傚疗established镄勮繛鎺ユ秷澶憋绂
2銆佺户缁鎶婅ュ弬鏁颁慨鏀逛负15锛岄吨澶崭笂闱㈢殑瀹为獙锛屽彂鐜板ぇ绾﹁繃浜15鍒嗛挓钖庯纴established镄勮繛鎺ユ墠鏂寮锛
3銆佹妸鍙傛暟鍐嶆′慨鏀逛负5锛屽ぇ绾﹁繃浜7绉掞纴杩炴帴娑埚け
/proc/sys/net/ipv4/tcp_retries2
镐濊冿细TCP镄勮秴镞跺悗锛岄吨浼犵殑娆℃暟鍜岄吨浼犵殑镞堕棿闂撮殧鏄褰卞搷杩炴帴鏂寮镄勪富瑕佸弬鏁般备絾鏄锛屼粠涓婇溃镄勫疄楠屾暟鎹𨱒ョ湅锛屼技涔庢病链変粈涔堣勫緥銆傛煡阒卨inux甯锷╂枃妗o纴鍙戠幇杩欎釜閲崭紶镄勬椂闂撮棿闅斾笌RTO链夊叧锛岃岃繖涓鍙傛暟鍙堟槸鍗忚镙堥氲繃妫娴嬬绣缁灭姸鍐佃屽疄镞舵敼鍙樼殑銆
linux鐪嬮棬镫楄秴镞剁郴缁熶笉鏂閲嶅惎锛
闾f槸浣犵殑鍐呮牳链夐梾棰樸
鎹涓鐗堟湰鎶娿傚傛灉鏄浣犺嚜宸辫佸壀镄勫唴镙革纴鐪嬬湅鏄涓嶆槸娌℃湁锽傜嫍銆傛垨钥呯矖𨱌寸偣鐩存帴绂佺敤鐪嬮棬镫椼‘肆’ recv函数返回什么值
recv函数返回其实际的字节数,如果recv在时出错,那么它返回SOCKET_ERROR。如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
扩展阅读,linux recv函数详解:
1 #include <sys/socket.h>
2 ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);
recv 的前3个参数等同于read函数。
flags参数值为0或:
flags
说明
recv
send
MSG_DONTWAIT
仅本操作非阻塞
MSG_OOB 发送或接收带外数据
MSG_PEEK
窥看外来消息
MSG_WAITALL
等待所有数据
recv函数解析:
sockfd: 接收端套接字描述符
buff: 用来存放recv函数接收到的数据的缓冲区
nbytes: 指明buff的长度
flags: 一般置为0
1) recv先等待s的发送缓冲区的数据被协议传送完毕,如果协议在传送sock的发送缓冲区中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR
2)
如果套接字sockfd的发送缓冲区中没有数据或者数据被协议成功发送完毕后,recv先检查套接字sockfd的接收缓冲区,如果sockfd的接收缓
冲区中没有数据或者协议正在接收数据,那么recv就一起等待,直到把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲区中的数据
到buff中(注意协议接收到的数据可能大于buff的长度,所以在这种情况下要调用几次recv函数才能把sockfd的接收缓冲区中的数据
完。recv函数仅仅是数据,真正的接收数据是协议来完成的)
3) recv函数返回其实际的字节数,如果recv在时出错,那么它返回SOCKET_ERROR。如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
4) 在unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用 recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。
‘伍’ linux阒诲炰笌闱为樆濉濒inux阒诲为潪阒诲
鍦ㄩ潪阒诲炴ā寮忎笂镐庝箞鐭ラ亾recv鎺ユ敹鏁版嵁瀹屾垚锛
浠linux涓媡cpsocket缂栫▼涓轰緥锛氶樆濉炲氨鏄痳ecv/read镄勬椂鍊檚ocket鎺ユ敹缂揿啿鍖鸿佹槸链夋暟鎹灏辫伙纴娌℃暟鎹鎴戝氨涓鐩寸浔瑙夎禆镌涓嶈蛋锛岀洿鍒版湁鏁版嵁𨱒ヤ简璇诲畬鎴戞墠璧般
send/write镄勬椂鍊欙纴瑕佹槸鍙戦佺紦鍐插尯婊′简锛屾病链夌┖闂寸户缁鍙戦佷简鎴戜篃涓鐩寸浔瑙夎禆镌涓嶈蛋锛岀洿鍒板彂阃佺紦鍐插尯鑵惧嚭瓒冲熺殑绌洪棿璁╂垜鎶婃暟鎹鍏ㄩ儴濉炲埌鍙戦佺紦鍐插尯閲屾垜镓嶈蛋銆
锛埚綋铹跺傛灉浣犻氲繃setsockopt璁剧疆浜呜诲啓瓒呮椂锛岃秴镞舵椂闂村埌浜呜缮鏄浼氲繑锲-1鍜孍AGAIN锛屼笉鍐岖浔瑙夌瓑寰咃级
闱为樆濉炲氨鏄痳ecv/read镄勬椂鍊欙纴瑕佹槸鎺ユ敹缂揿啿鍖烘湁鏁版嵁鎴戝氨璇诲畬锛屾病链夋暟鎹鎴戠洿鎺ュ甫镌杩斿洖镄-1鍜孍GAIN璧颁汉锛岀粷涓岖浔瑙夌瓑寰呰借镞堕棿銆
write/send镄勬椂鍊欙纴瑕佹槸鍙戦佺紦鍐插尯链夎冻澶熺殑绌洪棿锛屽氨绔嫔埢鎶婃暟鎹濉炲埌鍙戦佺紦鍐插尯铡伙纴铹跺悗璧颁汉锛屽傛灉鍙戦佺紦瀛桦尯婊′简锛岀┖闂翠笉瓒筹纴闾g洿鎺ュ甫镌杩斿洖镄-1鍜孍AGAIN璧颁汉銆傝呖浜嶪O澶氲矾澶岖敤锛岄栧厛瑕佺悊瑙g殑鏄锛屾搷浣灭郴缁熶负浣犳彁渚涗简涓涓锷熻兘锛屽綋浣犵殑镆愪釜socket鎺ユ敹缂揿瓨鍖烘湁鏁版嵁鍙璇伙纴鎴栬呭彂阃佺紦鍐插尯链夌┖闂村彲鍐欑殑镞跺欙纴瀹冨彲浠ョ粰浣犱竴涓阃氱煡銆
杩欐牱褰挞厤钖堥潪阒诲炵殑socket浣跨敤镞讹纴鍙链夊綋绯荤粺阃氱煡鎴戝摢涓鎻忚堪绗﹀彲璇讳简锛屾垜镓嶅幓镓ц宺ead镎崭綔锛屽彲浠ヤ缭璇佹疮娆read閮借兘璇诲埌链夋晥鏁版嵁钥屼笉锅氱函杩斿洖-1鍜孍AGAIN镄勬棤鐢ㄥ姛銆
鍐欐搷浣灭被浼笺
镎崭綔绯荤粺镄勮繖涓锷熻兘阃氲繃select/poll/epoll涔嬬被镄勭郴缁熻皟鐢ㄥ嚱鏁版潵浣跨敤锛岃繖浜涘嚱鏁伴兘鍙浠ュ悓镞剁洃瑙嗗氢釜鎻忚堪绗︾殑璇诲啓灏辩华鐘跺喌锛岃繖镙凤纴澶氢釜鎻忚堪绗︾殑I/O镎崭綔閮借兘鍦ㄤ竴涓绾跨▼鍐呭畬鎴愶纴杩椤氨鍙献/O澶氲矾澶岖敤锛岃繖閲岀殑钬滃岖敤钬濇寚镄勬槸澶岖敤钖屼竴涓绾跨▼銆傝呖浜庝簨浠堕┍锷锛屽叾瀹炴槸I/O澶氲矾澶岖敤镄勪竴涓鍙﹀栫殑绉板懠銆傝呖浜庡纾姝ュ悓姝ワ纴鎴戜滑甯歌佺殑linux涓嬬殑缃戠粶缂栫▼妯″瀷澶ч儴鍒嗛兘鏄钖屾io锛屼互璇绘搷浣滀负渚嬶纴链璐ㄤ笂閮芥槸闇瑕佺敤鎴疯皟鐢╮ead/recv铡讳粠鍐呮牳缂揿啿鍖烘妸鏁版嵁璇诲畬鍐嶅勭悊涓氩姟阃昏緫銆
寮傛io鍒欐槸鍐呮牳宸茬粡鎶婃暟鎹璇诲ソ浜嗭纴鐢ㄦ埛鐩存帴澶勭悊阃昏緫銆
寮傛IO鍦╨inux涓嬩竴鑸鏄鐢╝io搴撱
linuxaccept()鍑芥暟涓鐩村勪簬阒诲炵姸镐,浠涔埚师锲狅纻
accept锛堬级鍑芥暟灏辨槸阒诲炵殑鍟婏纴瑕佺瓑寰呮帴鏀跺埌链夊㈡埛绔璇锋眰镓嶅彲浠ヨ繘琛屽悗缁镄勬搷浣滐纴浣犳墍璋撶殑涓嶅彲浠ユ槸鎸囦粈涔堬纻
open绯荤粺浣跨敤鎶宸э纻
open绯荤粺鏄澶氱嶈瑷銆佺幆澧幂殑涓绉嶅嚱鏁般
LINUX涓璷pen鍑芥暟浣灭敤锛氭墦寮鍜屽垱寤烘枃浠躲侾B绋嫔簭璇瑷涓璷pen锷熻兘锛氭墦寮绐楀彛銆
瀵逛簬open绯荤粺𨱒ヨ达纴绗涓変釜鍙傛暟浠呭綋鍒涘缓鏂版枃浠舵椂锛埚嵆浣跨敤浜哋_CREAT镞讹级镓崭娇鐢锛岀敤浜庢寚瀹氭枃浠剁殑璁块梾𨱒冮檺浣嶃
pathname鏄寰呮墦寮/鍒涘缓鏂囦欢镄凯OSIX璺寰勫悕锛沠lags鐢ㄤ簬鎸囧畾鏂囦欢镄勬墦寮/鍒涘缓妯″纺锛岃繖涓鍙傛暟鍙鐢变互涓嫔父閲忛氲繃阃昏緫浣嶆垨阃昏緫鏋勬垚銆
镓揿紑/鍒涘缓鏂囦欢镞讹纴镊冲皯寰椾娇鐢ㄤ笂杩颁笁涓甯搁噺涓镄勪竴涓銆
浠ヤ笅甯搁噺鏄阃夌敤镄勶细
1.璁剧疆涓洪潪阒诲炴ā寮
2.浠ヤ笅涓変釜甯搁噺钖屾牱鏄阃夌敤镄勶纴瀹冧滑鐢ㄤ簬钖屾ヨ緭鍏ヨ緭鍑
3.open杩斿洖镄勬枃浠舵弿杩扮︿竴瀹氭槸链灏忕殑链琚浣跨敤镄勬弿杩扮︺