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