#########socket tcp 系统调优#############php
什么是socket?html
Socket 五元组 1.源ip地址 2. 源端口 3.目的ip地址 4.目的端口 5.类型 TCP or UDP前端
tcp报头以下:tcp首部报头20字节 其中目的端口和源端口分别是16bit,就是2**16-1个可用端口,0-65536 由于0不能用就减一 65535个java
在Centos7中能够查看可使用的端口数node
[root@192-168-13-165 ~]# cat /proc/sys/net/ipv4/ip_local_port_range 32768 60999 #下面是更改方法,通常不建议增长10000如下的端口,由于有些服务可能会使用10000如下#的端口容易引发冲突 [root@192-168-13-165 ~]# echo "10000 65000" > /proc/sys/net/ipv4/ip_local_port_range [root@192-168-13-165 ~]# cat /proc/sys/net/ipv4/ip_local_port_range 10000 65000
能够尝试用ab测试看是否能测试错socket限制问题,模拟发送2万个请求,2000的并发来测试百度mysql
[root@192.168.13.165]#ab -n 10000 -c 2000 https://www.baidu.com/ This isApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to TheApache Software Foundation, http://www.apache.org/ Benchmarkingwww.baidu.com (be patient) socket: Toomany open files (24)
报错咱们很容易看懂了socket: Too many open files (24) 不能打开太多的文件。咱们使用ulimit来看看系统资源限制。linux
[root@test ~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 31219 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 (省略部分输出)
没错,默认状况下,当前用户可以打开的文件数量最大是1024,可是这个和咱们使用ab测试有什么关系呢?ab测试建立的不是socket吗?若是你不理解,那就要回归本质,想一想咱们刚刚学习Linux的时候,常常听到的一句Linux的思想“一切皆文件”!谁说socket不是一个文件呢?nginx
可使用ulimit –n来修改当前用户、当前session的限制,也能够修改配置文件/etc/security/limits.conf来完全解决这个问题,这也是进行系统性能调优的必备基础。c++
NetCat检查nc,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。可经过TCP或UDP协议传输读写数据。同时,它仍是一个网络应用Debug分析器,由于它能够根据须要建立各类不一样类型的网络链接。git
做用:1.远程拷贝文件 2.克隆硬盘或分区 3.端口扫描 4.保存Web页面 5.模拟HTTP Headers 6.聊天 7.传输目录 详细见http://www.cnblogs.com/lpfuture/p/4638335.html
我这里用于演示tcp socket链接
[root@192-168-13-21 ~]# nc -l -4 -p 8888 -k hah hello [root@192-168-13-201 ~]# nc 192.168.13.21 8888 hah hello ^C #当13.201 ctrl C的时候查看网络链接状态为TIME_WAIT [root@192-168-13-201 ~]# netstat -an |grep 192.168.13.21 tcp 0 0 192.168.13.201:53667 192.168.13.21:8888 TIME_WAIT #在查看13.21 [root@192-168-13-21 ~]# netstat -an |grep 192.168.13.201 #当13.21 ctrl C的时候查看网络链接状态为TIME_WAIT [root@192-168-13-21 ~]# nc -l -4 -p 8888 -k hah ^C [root@192-168-13-21 ~]# netstat -an |grep 192.168.13.201 tcp 0 0 192.168.13.21:8888 192.168.13.201:53671 TIME_WAIT [root@192-168-13-201 ~]# netstat -an |grep 192.168.13.21 #从上面的实验中能够判断出TCP的TIME_WAIT状态只会出如今主动端口的一方!!! [root@192-168-13-21 ~]# lsof -i:8888 #listopenfile 的简写 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nc 1631 root 3u IPv4 1038816226 0t0 TCP *:ddi-tcp-1 (LISTEN) nc 1631 root 4u IPv4 1038828329 0t0 TCP 192-168-13-21:ddi-tcp-1->192.168.13.201:53681 (ESTABLISHED)
还有一种叫作伪终端发送数据
[root@192-168-13-201 ~]# echo "hehe" > /dev/tcp/192.168.13.21/8888 服务器端用nc监听8888就能收到hehe
若是有大量的TIME_WAIT存在,那么这个套接字对是不释放的,不释放也就表明着占用一个,资源嘛,占用一个就少一个。
下图实线为tcp 三次握手和四次断开客户端的状态变化过程,虚线为服务器端状态变化过程
状态图来自赵班长:
4次挥手
#tcp时间戳 (1为打开 0为关闭) [root@192-168-13-165 ~]# cat /proc/sys/net/ipv4/tcp_timestamps 1 #tcp socket复用 (1为打开 0为关闭) 尽可能用复用链接,这个配置主要影响的是Web服务器到DB服务器的链接复用,由于服务器是客户端 [root@192-168-13-165 ~]# cat /proc/sys/net/ipv4/tcp_tw_reus 0 #tcp socket快速回收 (1为打开 0为关闭) [root@192-168-13-165 ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle 0
1.socket 复用是根据时间戳 默认已经打开,reuse 打开前提是时间戳必须打开。
2.当客户端处于nat网络中 不能打开快速回收,通常在负载均衡器上是不开的
ps:
1.socket是有限的 1-65535,从另外一个角度来讲多ip能够解socket数量不足问题。
2.nginx不支持多ip发起请求,haproxy支持多ip发起请求
3.本身写程序通常要支持多ip发起请求,就是为了可扩展socket数量。
#############################end#########################
########nginx相关###########
keep-alive在nginx中keepalive_timeout
长链接多了cpu资源,少了可能就慢,由于用户要屡次链接。若是在链接数很大的状况下,设置30s到60s的keepalive_timeout区别会很大,并发的链接数可能飙升,长链接打开须要权衡,包括php到mysql的链接,要看mysql的最大链接数支持和性能等状况。
[root@192-168-13-165 ~]# cat /proc/sys/vm/swappiness 60
[root@192-168-13-165 ~]# cat /sys/block/sda/queue/scheduler noop anticipatory deadline [cfq]
io调度算法 centos7
[test@192-168-13-164 ~]$ cat /sys/block/sda/queue/scheduler noop [deadline] cfq
临地更改I/O调度方法:
例如:想更改到noop电梯调度算法:
echo noop > /sys/block/sda/queue/scheduler
想永久的更改I/O调度方法:
修改内核引导参数,加入elevator=调度程序名
vi /boot/grub/menu.lst
更改到以下内容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet
重启以后,查看调度方法:
cat /sys/block/sda/queue/scheduler noop anticipatory [deadline] cfq
已是deadline了