- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業務經營許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯網協會理事單位
- 安全聯盟認證網站身份V標記
- 域名注冊服務機構許可:滇D3-20230001
- 代理域名注冊服務機構:新網數碼
Linux上創建進程據說消耗很少,這個一直是Linux的特點,于是就專門測試Linux創建進程的極限,測試代碼如下:
//fork.c #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAXPROCESS 65535 #define SLEEPTIME 60 int main(int argc, char **argv) { pid_t pid; int count = 0; int maxprocess = MAXPROCESS; if (argc == 2) { maxprocess = atoi(argv[1]); } for (count = 0; count < maxprocess; count++) { pid = fork(); if (pid < 0) { perror("fork error"); exit(1); } else if (pid == 0) { printf("child %d start\n", count); sleep(SLEEPTIME); printf("child %d end\n", count); exit(0); } printf("parent:create %d child\n", count); } for (count = 0; count < MAXPROCESS; count++) { wait(); } exit(0); }
這段代碼是不斷創建子進程,默認是創建65535個進程,如果無法創建,就打印出錯誤。
測試代碼是我新建的一個blue帳戶進行運行測試,為了讓進程盡可能創建多的進程,首先要設置blue帳戶創建進程數的硬限制
使用root帳戶修改/etc/security/limits.conf文件,加入一下行:
blue hard nproc 65535
然后為blue帳戶設置創建進程的軟限制,在終端執行如下代碼:
ulimit -u 65535
到了這里,雖然我們設置blue帳戶創建進程數的硬限制和軟限制都是65535,但是我們還不能使用blue帳戶創建65535個進程,我們在Linux還需要設置內核參數kernel.pid_max,這個參數我默認安裝都是32768,所以即使使用root帳戶,卻不設置這個內核參數,整個系統最多可以創建的進程數就是32768,所以我們需要進行如下設置:
sysctl -w kernel.pid_max=65535
備注:如果是使用root帳戶執行程序,是不需要設置資源的硬限制和軟限制,但是還是需要設置進程pid最大值的內核參數,才可以創建65535個進程。
接著在同一終端切換為blue帳戶:
su blue
編譯和執行測試代碼:
gcc fork.c -o fork
./fork
我的虛擬機Linux內存是512M,在創建6千多個進程時,程序運行得很慢,通過vmstat命令觀察,發現swap內存的置入置出很頻繁,可以判斷是由于內存不足,使用虛擬內存,導致頻繁的IO操作,讓測試代碼變得很慢,所以創建過多進程時,系統的內存是重要衡量的一個方面。
后來我把測試代碼放到一臺配置比較好的至強服務器測試,內存是8G,在創建接近4W個進程時,程序的運行也到了瓶頸,依然是內存的瓶頸。
測試代碼中,創建的子進程,占用的內存相當小,實際使用中,只可能比測試代碼創建的進程使用更多的內存,所以相應的,同樣配置的機器,能創建的可用進程應該是更少的。
售前咨詢
售后咨詢
備案咨詢
二維碼
TOP