Linux創(chuàng)建進程達到65535的方法
Linux上創(chuàng)建進程據(jù)說消耗很少,這個一直是Linux的特點,于是就專門測試Linux創(chuàng)建進程的極限,測試代碼如下:
//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); }
這段代碼是不斷創(chuàng)建子進程,默認是創(chuàng)建65535個進程,如果無法創(chuàng)建,就打印出錯誤。
測試代碼是我新建的一個blue帳戶進行運行測試,為了讓進程盡可能創(chuàng)建多的進程,首先要設置blue帳戶創(chuàng)建進程數(shù)的硬限制
使用root帳戶修改/etc/security/limits.conf文件,加入一下行:
blue hard nproc 65535
然后為blue帳戶設置創(chuàng)建進程的軟限制,在終端執(zhí)行如下代碼:
ulimit -u 65535
到了這里,雖然我們設置blue帳戶創(chuàng)建進程數(shù)的硬限制和軟限制都是65535,但是我們還不能使用blue帳戶創(chuàng)建65535個進程,我們在Linux還需要設置內(nèi)核參數(shù)kernel.pid_max,這個參數(shù)我默認安裝都是32768,所以即使使用root帳戶,卻不設置這個內(nèi)核參數(shù),整個系統(tǒng)最多可以創(chuàng)建的進程數(shù)就是32768,所以我們需要進行如下設置:
sysctl -w kernel.pid_max=65535
備注:如果是使用root帳戶執(zhí)行程序,是不需要設置資源的硬限制和軟限制,但是還是需要設置進程pid最大值的內(nèi)核參數(shù),才可以創(chuàng)建65535個進程。
接著在同一終端切換為blue帳戶:
su blue
編譯和執(zhí)行測試代碼:
gcc fork.c -o fork ./fork
我的虛擬機Linux內(nèi)存是512M,在創(chuàng)建6千多個進程時,程序運行得很慢,通過vmstat命令觀察,發(fā)現(xiàn)swap內(nèi)存的置入置出很頻繁,可以判斷是由于內(nèi)存不足,使用虛擬內(nèi)存,導致頻繁的IO操作,讓測試代碼變得很慢,所以創(chuàng)建過多進程時,系統(tǒng)的內(nèi)存是重要衡量的一個方面。
后來我把測試代碼放到一臺配置比較好的至強服務器測試,內(nèi)存是8G,在創(chuàng)建接近4W個進程時,程序的運行也到了瓶頸,依然是內(nèi)存的瓶頸。
測試代碼中,創(chuàng)建的子進程,占用的內(nèi)存相當小,實際使用中,只可能比測試代碼創(chuàng)建的進程使用更多的內(nèi)存,所以相應的,同樣配置的機器,能創(chuàng)建的可用進程應該是更少的。
總結(jié)
以上所述是小編給大家介紹的Linux創(chuàng)建進程達到65535的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
Linux運維基礎httpd靜態(tài)網(wǎng)頁教程
這篇文章主要介紹了Linux運維基礎中怎樣制作httpd靜態(tài)網(wǎng)頁,附含源碼及圖片示例,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝進步2021-09-09Linux下使用使用socket實現(xiàn)TCP服務端的示例代碼
套接字(socket)是 Linux 下的一種進程間通信機制(socket IPC),它不僅支持同一主機的不同進程間通信,還支持跨網(wǎng)絡的不同主機的進程間通信,本文介紹了 Linux 下使用 socket 接口實現(xiàn) TCP 服務端的示例程序,需要的朋友可以參考下2024-03-03linux下用戶程序同內(nèi)核通信詳解(netlink機制)
這篇文章主要介紹了linux下用戶程序同內(nèi)核通信詳解(netlink機制),涉及netlink,內(nèi)核模塊,用戶程序的介紹等相關內(nèi)容,小編覺得還是挺不錯的,這里分享給大家,需要的朋友可以參考下2018-01-01Easypanel免費的VPS主機面板 可跨平臺Linux和Windows
Easypanel是一款免費的功能強大集開通虛擬主機,ftp空間,數(shù)據(jù)庫等功能為一體的主機控制面板,具備跨平臺(windows,linux),安全穩(wěn)定、操作簡便等特點,感興趣的小伙伴們可以關注一下2017-07-07詳解Linux系統(tǒng)中網(wǎng)卡MAC地址克隆方法
本篇文章主要介紹了詳解Linux系統(tǒng)中網(wǎng)卡MAC地址克隆方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06