#########socket tcp 系统调优#############
什么是socket?
Socket 五元组 1.源ip地址 2. 源端口 3.目的ip地址 4.目的端口 5.类型 TCP or UDP
tcp报头如下:tcp首部报头20字节 其中目的端口和源端口分别是16bit,就是2**16-1个可用端口,0-65536 因为0不能用就减一 65535个
在Centos7中可以查看可以使用的端口数
[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的并发来测试百度
[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来看看系统资源限制。
[root@test ~]# ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 31219max locked memory (kbytes, -l) 64max memory size (kbytes, -m) unlimitedopen files (-n) 1024(省略部分输出)
没错,默认情况下,当前用户能够打开的文件数量最大是1024,但是这个和我们使用ab测试有什么关系呢?ab测试创建的不是socket吗?如果你不理解,那就要回归本质,想想我们刚刚学习Linux的时候,经常听到的一句Linux的思想“一切皆文件”!谁说socket不是一个文件呢?
可以使用ulimit –n来修改当前用户、当前session的限制,也可以修改配置文件/etc/security/limits.conf来彻底解决这个问题,这也是进行系统性能调优的必备基础。
NetCat检查nc,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。可通过TCP或UDP协议传输读写数据。同时,它还是一个网络应用Debug分析器,因为它可以根据需要创建各种不同类型的网络连接。
作用: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 -khahhello[root@192-168-13-201 ~]# nc 192.168.13.21 8888hahhello^C#当13.201 ctrl C的时候查看网络连接状态为TIME_WAIT[root@192-168-13-201 ~]# netstat -an |grep 192.168.13.21tcp 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 -khah^C[root@192-168-13-21 ~]# netstat -an |grep 192.168.13.201tcp 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 NAMEnc 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_reus0#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/schedulernoop anticipatory [deadline] cfq
已经是deadline了