#########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了