首頁  >  文章  >  系統教程  >  掌握 Linux 進程和執行緒的重要性與實用技巧

掌握 Linux 進程和執行緒的重要性與實用技巧

WBOY
WBOY轉載
2024-02-15 08:27:12751瀏覽

身為 Linux 系統管理員,了解和掌握進程和執行緒的概念以及相應的實用技巧是非常重要的。這不僅有助於我們更好地管理系統資源,還能提高系統的運作效率和穩定性。本文將帶領大家深入了解 Linux 流程和線程,並分享一些實用的技巧和工具。

進程是一個具有一定獨立功能的程式關於某個資料集合的一次運行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,行程既是基本的分配單元,也是基本的執行單元。

進程

進程是一個具有一定獨立功能的程式關於某個資料集合的一次運行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,行程既是基本的分配單元,也是基本的執行單元。進程的概念主要有兩點:第一,進程是一個實體。每一個行程都有它自己的位址空間,一般情況下,包括文字區域(text region)、資料區域(data region)和堆疊(stack region)。文字區域儲存處理器執行的程式碼;資料區域儲存變數和進程執行期間使用的動態分配的記憶體;堆疊區域儲存著活動過程呼叫的指令和本地變數。第二,進程是一個「執行中的程式」。程式是沒有生命的實體,只有處理器賦予程式生命時(作業系統執行之),它才能成為一個活動的實體,我們稱之為流程。

線程

執行緒是作業系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每個線程並行執行不同的任務。在Unix System V及SunOS中也被稱為輕量級進程(lightweight processes),但輕量進程更多指核心執行緒(kernel thread),而把用戶執行緒(user thread)稱為執行緒。進程與執行緒之間的關係 同一進程中的多個執行緒將共享該進程中的全部系統資源,如虛擬位址空間,檔案描述符和訊號處理等等。但同一進程中的多個執行緒有各自的呼叫棧(call stack),自己的暫存器環境(register context),自己的執行緒本地儲存(thread-local storage)。

linux中執行緒與進程

linux核心中,行程與執行緒它們雖然都是任務,但是應該加以區分。其中,pid 是 process id,tgid 是 thread group ID。任何一個進程,如果只有主線程,那 pid 是自己,tgid 是自己,group_leader 指向的還是自己。但是,如果一個進程創建了其他線程,那就會有所變化了。執行緒有自己的 pid,tgid 就是行程的主執行緒的 pid,group_leader 指向的就是一個行程的主執行緒。所以有了 tgid,我們就知道 tast_struct 代表的是一個行程還是代表一個執行緒了。關係如下:

掌握 Linux 进程和线程的重要性与实用技巧

關於執行緒與行程的核心參數

ulimit 限制,在 Linux 下執行ulimit -a,你會看到 ulimit 對各種資源的限制。

掌握 Linux 进程和线程的重要性与实用技巧

其中的「max user processes」就是一個行程能創建的最大執行緒數,我們可以修改這個參數:

ulimit -u 66535

2.參數sys.kernel.threads-max限制。這個參數限製作業系統全域的執行緒數,透過下面的命令可以查看它的值。查看threads-max的方法:

cat /proc/sys/kernel/threads-max
32768

修改這個值的方法:

#方法一,重启后会失效
echo 65535 > /proc/sys/kernel/threads-max
#方法二,永久修改
echo "kernel.threads-max = 65535" >> /etc/sysctl.conf

3.參數sys.kernel.pid_max限制。這個參數限製作業系統全域的執行緒數,透過下面的命令可以查看它的值。這裡說一下32位元作業系統這個值最大是32768不能修改,64位元系統上pid_max最大值為2^22。 Linux 核心在初始化系統的時候,會根據機器 CPU 的數量來設定 pid_max 的值。比方說,如果機器中 CPU 數目小於等於 32,那麼 pid_max 就會被設定為 32768(32K);如果機器中的 CPU 數目大於 32,那麼 pid_max 就被設定為 N*1024 (N 就是 CPU 數目)。查看pid_max的方法:

cat /proc/sys/kernel/pid_max
32768

修改這個值的方法:

#方法一,重启后会失效
echo 65535 > /proc/sys/kernel/pid_max
#方法二,永久修改
echo "kernel.pid_max = 65535" >> /etc/sysctl.conf

注意:一個執行緒數也會佔用一個pid,所以threads-max須要小於等於pid_max。

容器執行緒數量的限制

#

對於 Linux 系統而言,容器就是一組流程的集合。如果容器中的應用程式建立過多的程序或出現 bug,就會產生類似 fork bomb 的行為。這樣,不但會使同一個節點上的其他容器無法運作,還會讓宿主機本身也無法運作。所以對於每個容器來說,我們都需要限制它的最大進程數目,而這個功能是由 pids Cgroup 這個子系統來完成。之前曾經遇到這樣一個問題,java應用因為要處理很多定時任務,一個定時任務拉起一個執行緒。但由於程式碼上的bug ,沒有及時對線程進行回收,然後這個容器不斷產生線程,耗盡了宿主機的進程表空間,最終導致整個linux上的服務報錯“java.lang.OutOfMemoryError: Unable to create native threads”,影響了其它的服務。建立進程出現「Resource temporarily unavailable」的報錯。這種問題除了讓開發人員修復 bug 外,還需要在系統層面對執行緒數量進行限制。

cgroup

#cgroup中對pid進行了隔離,透過更改docker/kubelet配置,可以限制pid總數,從而達到限制執行緒總數的目的。

docker,容器啟動時設定 –pids-limit 參數,限制容器等級pid總數

kubelet,開啟SupportPodPidsLimit特性,設定–pod-max-pids參數,限制node每個pod的pid總數

原則如下:在一個容器建立之後,建立容器的服務會在 /sys/fs/cgroup/pids 下建立一個子目錄,就是一個控制群組,控制群組裡最關鍵的一個檔案就是 pids.max。 kubelet或docker向這個檔案寫入數值,而這個值就是這個容器中允許的最大進程數目。 Kubernetes 裡面的每個節點都會運行一個叫做 Kubelet 的服務,負責節點上容器的狀態和生命週期,例如建立和刪除容器。根據 Kubernetes 的官方文件 Process ID Limits And Reservations 內容,可以設定 Kubelet 服務的 –pod-max-pids 配置選項,之後在該節點上建立的容器,最終都會使用 Cgroups pid 控制器限制容器的進程數量。

總結

透過本文的介紹和分析,我們了解了 Linux 進程和執行緒的概念、差異、狀態轉換及其對系統資源的影響。同時,我們也分享了一些實用技巧和工具,例如進程調優、偵測工具和管理工具等。這些工具和技巧不僅能夠幫助我們更好地管理系統資源,提高系統的運作效率和穩定性,還能夠提高我們的工作效率和競爭力。因此,掌握 Linux 進程和執行緒的重要性與實用技巧對我們來說是非常必要的。

以上是掌握 Linux 進程和執行緒的重要性與實用技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:lxlinux.net。如有侵權,請聯絡admin@php.cn刪除