一、什么是ulimit-n
ulimit是一個(gè)用于Linux系統(tǒng)進(jìn)程控制的命令,允許管理員限制每個(gè)用戶進(jìn)程可以擁有的資源。-n是ulimit命令的其中一個(gè)選項(xiàng),用于設(shè)置每個(gè)用戶的文件描述符數(shù)量上限。
二、為什么需要ulimit-n永久生效
ulimit-n設(shè)置的文件描述符數(shù)量上限只對(duì)當(dāng)前會(huì)話有效,當(dāng)用戶重新登錄后,該設(shè)置會(huì)失效。如果希望這個(gè)設(shè)置得以永久保留,需要對(duì)配置文件進(jìn)行修改。
三、修改配置文件
Linux系統(tǒng)中ulimit-n的配置文件通常為/etc/security/limits.conf。我們需要在該配置文件中添加以下內(nèi)容:
* soft nofile 65536
* hard nofile 65536
其中,第一行表示將所有用戶的file descriptor數(shù)量上限(soft limit)設(shè)為65536,第二行表示將所有用戶的file descriptor數(shù)量上限(hard limit)也設(shè)為65536。這樣,所有用戶的文件描述符數(shù)量上限就被設(shè)置為了65536,可以根據(jù)實(shí)際情況進(jìn)行修改。
四、重啟生效
修改配置文件后,需要重啟生效。可以通過(guò)執(zhí)行以下命令來(lái)檢查配置是否生效:
$ ulimit -n
如果輸出結(jié)果為65536,則表示已成功使ulimit-n永久生效。
五、其他一些注意事項(xiàng)
1. 用戶限制
除了設(shè)置全局的文件描述符數(shù)量上限外,還可以為某個(gè)用戶或某個(gè)群組單獨(dú)設(shè)置文件描述符數(shù)量上限。
例如,要為用戶名為test的用戶設(shè)置文件描述符數(shù)量上限為2048,可以在limits.conf文件中添加以下內(nèi)容:
test soft nofile 2048
test hard nofile 2048
這樣,test用戶的文件描述符數(shù)量上限就會(huì)被設(shè)置為2048。
2. ulimit-n參數(shù)
除了在配置文件中設(shè)置ulimit-n的值,還可以直接在命令行中使用ulimit命令設(shè)置ulimit-n的值,如:
$ ulimit -n 2048
這里將ulimit-n設(shè)置為了2048。
需要注意的是,通過(guò)ulimit命令設(shè)置的ulimit-n的值只在當(dāng)前會(huì)話中有效,重啟后會(huì)失效。
3. /etc/security/limits.d/目錄
除了/etc/security/limits.conf之外,還有一個(gè)/etc/security/limits.d/目錄,該目錄下的配置文件也會(huì)被讀取。如果在limits.conf中設(shè)置的值和limits.d目錄下的配置文件存在沖突,則以后者為準(zhǔn)。
4. 硬限制和軟限制
ulimit-n有兩個(gè)參數(shù):硬(limit)限制和軟(soft)限制。軟限制指的是當(dāng)前進(jìn)程可以打開的文件描述符數(shù)量,硬限制則指的是最大可以設(shè)置的文件描述符數(shù)量上限。
當(dāng)用戶嘗試將soft limit設(shè)置為大于hard limit的值時(shí),只有擁有root權(quán)限的用戶才能修改。
5. 必要性分析
這里需要注意的是,將ulimit-n設(shè)置得過(guò)大會(huì)占用過(guò)多的系統(tǒng)資源。因此,需要根據(jù)實(shí)際情況進(jìn)行設(shè)置,不能盲目地將其設(shè)置得過(guò)大。
需要給系統(tǒng)賦予足夠的并發(fā)連接數(shù)時(shí),必須正確設(shè)置ulimit參數(shù)。如在Nginx、MySQL、Redis等網(wǎng)絡(luò)服務(wù)中,一個(gè)連接到服務(wù)的客戶端將占用一個(gè)文件描述符,同時(shí)每個(gè)進(jìn)程還會(huì)自己使用一些文件描述符,因此需要為每個(gè)服務(wù)進(jìn)程設(shè)置足夠的文件描述符數(shù)量上限。