100萬并發(fā)連接服務(wù)器筆記之測試端就緒
重新編寫測試端程序
測試端程序需要增加綁定本機(jī)IP和本地端口的功能,以盡可能的向外發(fā)出更多的tcp請求。需要對client1.c重構(gòu),增加參數(shù)傳遞。 下面是client2.c的代碼
若不指定端口,系統(tǒng)會隨機(jī)挑選沒有使用到的端口,可以節(jié)省些心力。
編譯:
gcc -o client2 client2.c -levent
參數(shù)解釋
- -h 要連接的服務(wù)器IP地址
- -p 要連接的服務(wù)器端口
- -m 本機(jī)IP地址需要綁定的隨機(jī)端口數(shù)量
- -o 本機(jī)所有可用的IP地址列表,注意所有IP地址都應(yīng)該可用
運(yùn)行:
./client2 -h 192.168.190.230 -p 8000 -m 64000 -o 192.168.190.134,192.168.190.143,192.168.190.144,192.168.190.145,192.168.190.146,192.168.190.147,192.168.190.148,192.168.190.149,192.168.190.150,192.168.190.151
太長了,每次執(zhí)行都要粘貼過去,直接放在一個(gè)client2.sh文件中,執(zhí)行就很簡單方便多了。
#!/bin/sh
./client2 -h 192.168.190.230 -p 8000 -m 64000 -o 192.168.190.134,192.168.190.143,192.168.190.144,192.168.190.145,192.168.190.146,192.168.190.147,192.168.190.148,192.168.190.149,192.168.190.150,192.168.190.151
保存,賦值可運(yùn)行:
chmod +x client2.sh
啟動(dòng)測試:
sh client2.sh
第三個(gè)遇到的問題:fs.file-max的問題
測試端程序client2.c在發(fā)出的數(shù)量大于某個(gè)值(大概為40萬時(shí))是,通過dmesg命令查看會得到大量警告信息:
[warn] socket: Too many open files in system
此時(shí),就需要檢查/proc/sys/fs/file-max參數(shù)了。
查看一下系統(tǒng)對fs.file-max的說明
/proc/sys/fs/file-max
This file defines a system-wide limit on the number of open files for all processes. (See also setrlimit(2), which can be used by a process to set the per-process limit,
RLIMIT_NOFILE, on the number of files it may open.) If you get lots of error messages about running out of file handles, try increasing this value:
echo 100000 > /proc/sys/fs/file-max
The kernel constant NR_OPEN imposes an upper limit on the value that may be placed in file-max.
If you increase /proc/sys/fs/file-max, be sure to increase /proc/sys/fs/inode-max to 3-4 times the new value of /proc/sys/fs/file-max, or you will run out of inodes.
file-max表示系統(tǒng)所有進(jìn)程最多允許同時(shí)打開所有的文件句柄數(shù),系統(tǒng)級硬限制。Linux系統(tǒng)在啟動(dòng)時(shí)根據(jù)系統(tǒng)硬件資源狀況計(jì)算出來的最佳的最大同時(shí)打開文件數(shù)限制,如果沒有特殊需要,不用修改,除非打開的文件句柄數(shù)超過此值。
在為測試機(jī)分配4G內(nèi)存時(shí),對應(yīng)的fs.file-max值為386562,很顯然打開的文件句柄很受限,38萬個(gè)左右。
很顯然,無論是測試端還是服務(wù)端,都應(yīng)該將此值調(diào)大些,一定要大于等于/etc/security/limits.conf送所設(shè)置的soft nofile和soft nofile值。
注意ulimit -n,僅僅設(shè)置當(dāng)前shell以及由它啟動(dòng)的進(jìn)程的資源限制。
備注:以上參數(shù),具有包含和被包含的關(guān)系。
當(dāng)前會話修改,可以這么做:
echo 1048576 > /proc/sys/fs/file-max
但系統(tǒng)重啟后消失。
永久修改,要添加到 /etc/sysctl.conf 文件中:
fs.file-max = 1048576
保存并使之生效:
sysctl -p
再測,就不會出現(xiàn)此問題了。
一臺6G內(nèi)存機(jī)器測試機(jī),分配7個(gè)網(wǎng)卡,可以做到不占用虛擬內(nèi)存,對外發(fā)出64000 * 7 = 448000個(gè)對外持久請求。要完成100萬的持久連接,還得再想辦法。
最終測試端組成如下:
- 兩臺物理機(jī)器各自一個(gè)網(wǎng)卡,每個(gè)發(fā)出64000個(gè)請求
- 兩個(gè)6G左右的centos測試端機(jī)器(綁定7個(gè)橋接或NAT連接)各自發(fā)出64000*7 = 448000請求
- 共使用了16個(gè)網(wǎng)卡(物理網(wǎng)卡+虛擬網(wǎng)卡)
- 1M ≈ 1024K ≈ 1024000 = (64000) + (64000) + (64000*7) + (64000*7)
- 共耗費(fèi)16G內(nèi)存,16個(gè)網(wǎng)卡(物理+虛擬),四臺測試機(jī)
備注:
下面就要完成1M持久連接的目標(biāo),但在服務(wù)端還會遇到最后一個(gè)問題。
posted on 2013-04-10 11:07 nieyong 閱讀(7265) 評論(2) 編輯 收藏 所屬分類: C1M