Linux – Shared memory

Loading

測試環境為 CentOS8 (虛擬機)

Apache 突然掛了,檢查系統訊息出現以下的錯誤.

[root@localhost ~]# cat /var/log/httpd/error_log
No space left on device: AH01760: failed to create shared memory segment

shared memory 共享記憶體,主要用途是允許兩個程序 Process 存取同一個邏輯記憶體,要怎麼檢視目前系統的 shared memory 的設定.

[root@localhost ~]# cat /proc/sys/kernel/sem
32000	1024000000	500	32000

[root@localhost ~]# ipcs -ls

------ Semaphore Limits --------
max number of arrays = 32000
max semaphores per array = 32000
max semaphores system wide = 1024000000
max ops per semop call = 500
semaphore max value = 32767

限制公式 : (max number of arrays)*(max semaphores per array) >= (max semaphores system-wide)

如果要修改設定,可以使用以下兩種方式.

  1. 立即修改
    [root@localhost ~]# sysctl -w kernel.sem="250 32000 32 192"
    kernel.sem = 250 32000 32 192
    [root@localhost ~]# sysctl -a| grep kernel.sem
    kernel.sem = 250	32000	32	192
    
  2. 定義在檔案
    可自行定義一個檔案在 /etc/sysctl.d/ 或是 /usr/lib/sysctl.d/ 目錄下.

    [root@localhost ~]# echo "kernel.sem="32000 1024000000 1000 32000"" > /etc/sysctl.d/sem.conf 
    [root@localhost ~]# cat /etc/sysctl.d/sem.conf 
    kernel.sem=32000 1024000000 1000 32000
    

    要立即生效可以透過 sysctl -p file

    [root@localhost ~]# sysctl -a| grep kernel.sem
    kernel.sem = 250	32000	32	192
    [root@localhost ~]# sysctl -p/etc/sysctl.d/sem.conf 
    kernel.sem = 32000 1024000000 1000 32000
    [root@localhost ~]# sysctl -a| grep kernel.sem
    kernel.sem = 32000	1024000000	1000	32000
    

除了設定 Shared memory 大小外還可以透過以下指令來移除指定的 shmid.
檢視系統中的 (IPC: Inter-Process Communication) resources.

[root@localhost ~]# ipcs -m
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status  

刪除系統中指定的 (IPC: Inter-Process Communication) resources.

[root@localhost ~]# ipcrm -m [shmid]

檢視系統中的 Apache 所使用的 (IPC: Inter-Process Communication) resources.

[root@localhost ~]# ipcs -a | grep apache | wc -l
90

清理 Apache 所使用的 (IPC: Inter-Process Communication) resources.

[root@localhost ~]# ipcs -a | grep apache | awk '{print $2}' | xargs -n1 ipcrm -s

並重新啟動 Apache

[root@localhost ~]# systemctl restart httpd
沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料