一、什麼是lowmemory?
lowmemory是一個Linux內核中的機制,用於在系統空間內存不足時,保護內核不受到過度的壓力而崩潰。低內存進程會被Linux內核無情地「殺死」,以釋放內存和減輕壓力。
在低內存情況下,Linux內核默認會使用OOM(out-of-memory)Killer機制,而經常死亡的進程則會成為被誤殺的犧牲品。為了避免被誤殺並保護系統持續運行,lowmemory會對進程進行優先級劃分。
二、lowmemory的優先級劃分
lowmemory將所有進程劃分為以下幾種優先級:
1. 最高優先級:具有MMALLOC帳戶的進程。
2. 高優先級:具有系統調用允許帳戶的進程。
3. 正常優先級:其他進程。
具有MMALLOC帳戶的進程是通過Linux內核的slab分配算法獲得高速緩存。這些進程通常是系統重要進程,如init、kthread等。
系統調用允許的帳戶在內核中被認為是更安全的,因此它們也獲得了更高的優先級。像Apache、Mysql等重要服務進程通常被設置為具有該帳戶。
三、Linux內核參數的優化
下面是一些優化Linux內核參數的方法,以避免由於內存緊縮而導致的系統崩潰。
1. 優化vm.min_free_kbytes
vm.min_free_kbytes參數表示內存中最小的可用頁面數。如果低於該值,內核將開始把不必要的頁面刪掉,以獲得空閑頁面。較高的vm.min_free_kbytes值將導致更少的頁面被釋放,而較低的值可能導致OOM killer誤殺重要進程。
echo "vm.min_free_kbytes=65535" >> /etc/sysctl.conf sysctl -p
2. 優化vm.overcommit_memory
vm.overcommit_memory屬性定義了進程的內存分配策略。它有三種可選的策略:
0(默認):內存不足時,進程分配失敗;
1:進程分配出去的內存不必被Linux真正的分配。
2(最小值):向進程提供儘可能多的內存,即使可能導致新開的進程被縮回。
echo "vm.overcommit_memory=2" >> /etc/sysctl.conf sysctl -p
3. 優化vm.swappiness
vm.swappiness參數控制着內核何時將內存頁面交換出來。如果設置為0,整個頁面交換機制將被關閉。較高的vm.swappiness值將導致更多的頁面被交換出去,而較低的值將導致更少的頁面被交換出去。
echo "vm.swappiness=10" >> /etc/sysctl.conf sysctl -p
四、結語
通過對lowmemory的深入探討,我們了解到了Linux內核中的內存管理機制,以及如何通過優化Linux內核參數來避免內存壓縮導致系統崩潰。希望這篇文章能對您的Linux系統的運行穩定性提供一些參考。
原創文章,作者:BSAFT,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/333237.html