如何釋放伺服器記憶體

2023-08-30 21:01:11

伺服器記憶體的管理對於維持系統效能和穩定執行至關重要。當伺服器記憶體不足時,可能導致系統變得緩慢、不穩定或甚至崩潰。因此,釋放伺服器記憶體是一項重要的任務。本文將介紹幾種常用的方法來釋放伺服器記憶體。

1. 檢視當前記憶體使用情況

首先,我們需要了解當前伺服器記憶體的使用情況。可以通過命令 free -h 或者 top 來檢視。這些命令將提供有關可用記憶體、已使用記憶體和快取等資訊。通過檢視這些資料,可以判斷是否需要釋放記憶體。

2. 停止不必要的程序

使用 top 命令或者 ps -aux 命令檢視當前正在執行的程序,並找出佔用大量記憶體的程序。可以使用 kill 命令停止或重啟這些程序,以釋放它們佔用的記憶體。但請確保停止的是非關鍵程序,以免影響系統的正常執行。

3. 清除快取

Linux系統會自動將一些資料儲存在快取中,以加快存取速度。然而,如果伺服器記憶體不足,可以手動清除快取來釋放記憶體。以下是幾個常用的命令:

  • sync:將檔案系統緩衝區的內容寫入磁碟。
  • echo 1 > /proc/sys/vm/drop_caches:清空pagecache。
  • echo 2 > /proc/sys/vm/drop_caches:清空dentries和inodes快取。
  • echo 3 > /proc/sys/vm/drop_caches:清空pagecache、dentries和inodes快取。

通過執行這些命令,可以釋放被佔用的快取記憶體,但請注意只在必要時才執行此操作。

4. 調整程序或服務的記憶體限制

對於特定的程序或服務,可以通過修改其組態檔或使用相應的命令列選項來調整其記憶體使用。例如,對於Apache Web伺服器,可以修改 httpd.conf 檔案中的 MaxRequestsPerChildMaxClients 引數來限制記憶體使用量。通過適當地調整這些引數,可以減少記憶體佔用並釋放一部分記憶體。

5. 重啟伺服器

如果以上步驟無法釋放足夠的記憶體,可以考慮重啟伺服器。通過重啟伺服器,可以清除所有未釋放的記憶體,並重新載入系統。然而,重啟伺服器應該是最後的手段,並且需要謹慎操作。

總結起來,釋放伺服器記憶體是一項重要的任務,可以通過停止不必要的程序、清除快取、調整程序或服務的記憶體限制以及重啟伺服器來實現。但是,在執行這些操作之前,請確保你瞭解每個操作的影響,並根據實際情況進行操作。此外,為了避免頻繁出現記憶體問題,建議優化伺服器設定和程式程式碼,以減少記憶體佔用。通過合理管理和釋放伺服器記憶體,可以確保系統的穩定性和效能。


 

範例:

1. 啟動服務失敗,問題原因是由應用啟動所需的記憶體( -Xms12g -Xmx12g)不足導致

[root@yth01-crux-oracle-node178 XXX]# ./startup.sh
./XXX-startup.sh: line 3: ./loader.sh: Permission denied
發現 XXX-web-8.33-SNAPSHOT.jar 存在,即將啟動
正在刪除紀錄檔檔案,請耐心等待。。。
正在啟動服務,請耐心等待。。。
[root@yth01-crux-oracle-node178 XXX]# nohup: redirecting stderr to stdout

[root@yth01-crux-oracle-node178 XXX]# tail -f nohup.out
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000004e0800000, 12884901888, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 12884901888 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /u01/XXX8.33/product/module/A/XXX/hs_err_pid452.log


[root@yth01-crux-oracle-node178 XXX]# tail -f hs_err_pid452.log


Memory: 4k page, physical 31728604k(2935060k free), swap 0k(0k free)

vm_info: Java HotSpot(TM) 64-Bit Server VM (25.381-b09) for linux-amd64 JRE (1.8.0_381-b09), built on Jun 14 2023 13:47:37 by "java_re" with gcc 7.3.0

time: Wed Aug 30 10:19:44 2023
timezone: CST
elapsed time: 0.037063 seconds (0d 0h 0m 0s)

2. 檢視並釋放伺服器記憶體

[root@yth01-crux-oracle-node178 XXX]# free -h
total used free shared buff/cache available
Mem: 30G 6.5G 2.6G 13G 21G 9.7G
Swap: 0B 0B 0B
[root@yth01-crux-oracle-node178 XXX]# echo 3 > /proc/sys/vm/drop_caches
[root@yth01-crux-oracle-node178 XXX]# free -h
total used free shared buff/cache available
Mem: 30G 6.5G 17G 5.7G 5.9G 17G
Swap: 0B 0B 0B
[root@yth01-crux-oracle-node178 XXX]#

3. 再次啟動服務成功

[root@yth01-crux-oracle-node178 XXX]# ./startup.sh
./XXX-startup.sh: line 3: ./loader.sh: Permission denied
發現 XXX-web-8.33-SNAPSHOT.jar 存在,即將啟動
正在刪除紀錄檔檔案,請耐心等待。。。
正在啟動服務,請耐心等待。。。
[root@yth01-crux-oracle-node178 XXX]# nohup: redirecting stderr to stdout

[root@yth01-crux-oracle-node178 XXX]# tail -f nohup.out
08-30 10:21:44.086 INFO PinpointStarter : agent Lib:/opt/pinpoint-agent-2.4.0/lib/log4j-core-2.12.4.jar
08-30 10:21:44.086 INFO PinpointStarter : agent Lib:/opt/pinpoint-agent-2.4.0/lib/grpc-protobuf-1.43.2.jar
08-30 10:21:44.087 INFO PinpointStarter : agent Lib:/opt/pinpoint-agent-2.4.0/lib/asm-tree-9.2.jar
08-30 10:21:44.087 INFO PinpointStarter : agent Lib:/opt/pinpoint-agent-2.4.0/lib/pinpoint-commons-buffer-2.4.0.jar
08-30 10:21:44.088 INFO PinpointStarter : agent Lib:/opt/pinpoint-agent-2.4.0/lib/pinpoint-agent-proxy-common-2.4.0.jar
08-30 10:21:44.088 INFO PinpointStarter : agent Lib:/opt/pinpoint-agent-2.4.0/lib/grpc-context-1.43.2.jar
08-30 10:21:44.088 INFO PinpointStarter : agent Lib:/opt/pinpoint-agent-2.4.0/lib