最近在用freeswitch軟交換進(jìn)行語音通話,通話的時(shí)候需要調(diào)用音頻文件進(jìn)行播放,當(dāng)并發(fā)量上來的時(shí)候,freeswitch監(jiān)聽服務(wù)的端口會(huì)不斷的down掉,查看日志發(fā)現(xiàn)報(bào)了一個(gè)錯(cuò)如下:
這個(gè)問題經(jīng)常在linux上出現(xiàn),而且常見于高并發(fā)訪問文件系統(tǒng)、多線程網(wǎng)絡(luò)連接等場(chǎng)景。
在Linux系統(tǒng)中,目錄、字符設(shè)備、塊設(shè)備、套接字、打印機(jī)等都被抽象成了文件,即通常所說的“一切皆文件”。程序操作這些文件時(shí),系統(tǒng)就需要記錄每個(gè)當(dāng)前訪問file的name、location、access authority等相關(guān)信息,這樣一個(gè)實(shí)體被稱為file entry。這些實(shí)體被記錄在open files table中,Linux系統(tǒng)配置了open files table中能容納多少file entry。如果超過這個(gè)配置值,則Linux就會(huì)拒絕其他文件操作的請(qǐng)求,并拋出Too many open files。
我們可以輸入命令:ulimit -a,來查看這個(gè)設(shè)定的閥值:
當(dāng)連接文件的數(shù)量超過1024時(shí),就會(huì)出現(xiàn)Socket Error[Too many open files]的錯(cuò)誤,所以我們要調(diào)整這個(gè)值,一個(gè)是系統(tǒng)要調(diào)整這個(gè)閥值,還有就是應(yīng)用程序要調(diào)整這個(gè)值:
系統(tǒng)要調(diào)整這個(gè)閥值,我們?cè)?etc/sysctl.conf中添加以下內(nèi)容,添加完需要使用命令sysctl -p加載系統(tǒng)參數(shù):
net.core.somaxconn參數(shù)是用于調(diào)節(jié)系統(tǒng)同時(shí)發(fā)起的TCP連接數(shù);
參數(shù)net.core.netdev_max_backlog表示當(dāng)每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí),允許發(fā)送到隊(duì)列的數(shù)據(jù)包的最大數(shù)目;
還有一個(gè)就是應(yīng)用程序的參數(shù)調(diào)節(jié),就是freeswitch應(yīng)用的參數(shù),目錄是在/usr/lib/systemd/system/freeswitch.service:
加入紅色框中的內(nèi)容,也是需要命令systemctl freeswitch reload加載參數(shù),這時(shí)在輸入ulimit -a:
由于freeswitch session數(shù)量的限制,不會(huì)超過open files設(shè)置的閥值,這樣系統(tǒng)運(yùn)行起來就沒有問題了!