top 記憶體mem的used很高,或者100%
top 記憶體mem的used很高,或者100%
Linux伺服器執行一段時間後,由於其記憶體管理機制,會將暫時不用的記憶體轉為buff/cache,這樣在程式使用到這一部分資料時,能夠很快的取出,從而提高系統的執行效率,所以這也正是linux記憶體管理中非常出色的一點,所以乍一看記憶體剩餘的非常少,但是在程式真正需要記憶體空間時,linux會將快取讓出給程式使用,這樣達到對記憶體的最充分利用,所以真正剩餘的記憶體是free+buff/cache
但是有些時候大量的快取佔據空間,這時候應用程式回去使用swap交換空間,從而使系統變慢,這時候需要手動去釋放記憶體,釋放記憶體的時候,首先執行命令 sync
說到清理記憶體,那麼不得不提到/proc這一個虛擬檔案系統,這裡面的資料和檔案都是記憶體中的實時資料,很多引數的獲取都可以從下面相應的檔案中得到,比如檢視某一程序佔用的記憶體大小和各項引數,cpu和主機板的詳細資訊,顯示卡的引數等等;相應的關於記憶體的管理方式是在/proc/sys/vm/drop_chches檔案中,一定要注意這個檔案中存放的並不是具體的記憶體內容,而是0-3這幾個數字,通過檔案大小隻有1B也可以知道,而這些代號分別告訴系統代表不同的含義如下:
0:0是系統預設值,預設情況下表示不釋放記憶體,由作業系統自動管理
1:釋放頁快取
2:釋放dentries和inodes
3:釋放所有快取
所以根據上面的說明,分別將1,2,3這3個數字重定向到drop_caches中可以實現記憶體的釋放,一般釋放記憶體都是重定向3到檔案中,釋放所有的快取
那麼下面舉個例子,比如這裡只釋放頁快取,首先使用 free -h 檢視當前記憶體剩餘
free -m
當前記憶體剩餘570M左右,另外buff/cache是1.3G,根據上面說的現在真正的剩餘記憶體應該是1.8G左右,首先寫快取到檔案系統:
sync
然後執行下面命令釋放記憶體(頁快取buff/cache):
echo 1 > /proc/sys/vm/drop_caches
執行完之後,再次檢視記憶體剩餘:
會發現記憶體被釋放了,可用記憶體確實變為1.8G左右
到這裡記憶體就釋放完了,現在drop_caches中的值為1,如果現在想讓作業系統重新分配記憶體,那麼設定drop_caches的值為0即可:
echo 0 > /proc/sys/vm/drop_caches
另外需要注意的是,在生產環境中的伺服器我們不要頻繁的去釋放記憶體,只在必要時候清理記憶體即可,更重要的是我們應該從應用程式層面去優化記憶體的利用和釋放,經常清理記憶體可能只是暫時遮蔽的應用程式中的一些bug,所以更重要的是程式的調優,其他的交給作業系統來管理
Linux伺服器執行一段時間後,由於其記憶體管理機制,會將暫時不用的記憶體轉為buff/cache,這樣在程式使用到這一部分資料時,能夠很快的取出,從而提高系統的執行效率,所以這也正是linux記憶體管理中非常出色的一點,所以乍一看記憶體剩餘的非常少,但是在程式真正需要記憶體空間時,linux會將快取讓出給程式使用,這樣達到對記憶體的最充分利用,所以真正剩餘的記憶體是free+buff/cache
但是有些時候大量的快取佔據空間,這時候應用程式回去使用swap交換空間,從而使系統變慢,這時候需要手動去釋放記憶體,釋放記憶體的時候,首先執行命令 sync 將所有正在記憶體中的緩衝區寫到磁碟中,其中包括已經修改的檔案inode、已延遲的塊I/O以及讀寫對映檔案,從而確保檔案系統的完整性
說到清理記憶體,那麼不得不提到/proc這一個虛擬檔案系統,這裡面的資料和檔案都是記憶體中的實時資料,很多引數的獲取都可以從下面相應的檔案中得到,比如檢視某一程序佔用的記憶體大小和各項引數,cpu和主機板的詳細資訊,顯示卡的引數等等;相應的關於記憶體的管理方式是在/proc/sys/vm/drop_chches檔案中,一定要注意這個檔案中存放的並不是具體的記憶體內容,而是0-3這幾個數字,通過檔案大小隻有1B也可以知道,而這些代號分別告訴系統代表不同的含義如下:
0:0是系統預設值,預設情況下表示不釋放記憶體,由作業系統自動管理
1:釋放頁快取
2:釋放dentries和inodes
3:釋放所有快取
所以根據上面的說明,分別將1,2,3這3個數字重定向到drop_caches中可以實現記憶體的釋放,一般釋放記憶體都是重定向3到檔案中,釋放所有的快取
那麼下面舉個例子,比如這裡只釋放頁快取,首先使用 free -h 檢視當前記憶體剩餘