Oracle:ORA-27125: unable to create shared memory segment:因為內存參數 【kernel.shmall】設置太小引起的故障


問題:

  在一個具有128G內存的Centos7.9的系統上,創建多個oracle 12.2.0.1實例時,后面的實例無法啟動,報錯:

SQL> ORA-27125: unable to create shared memory segment
Linux-x86_64 Error: 28: No space left on device
Additional information: 3822
Additional information: 4278190080

  經過使用strace跟蹤,發現:

[pid 13722] shmget(IPC_PRIVATE, 4278190080, IPC_CREAT|IPC_EXCL|0600) = -1 ENOSPC (No space left on device)

  

分析:

  經查,該錯誤是由於無法分配共享內存段引起!!

  運行“free -h”,發現系統的可用內存很多; “df -h” 發現tempfs系統相關掛載點 也有很多的空間;

  運行“ipcs -l” 發現【

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32780378
max total shared memory (kbytes) = 26224300
min seg size (bytes) = 1

】共享內存部分,結合“lpcs -u”發現【

------ Shared Memory Status --------
segments allocated 20
pages allocated 6293514
pages resident  3661252
pages swapped   0
Swap performance: 0 attempts     0 successes

】當前linux系統的“kernel.shmall = 6556075”,也就總計最大共享內存限制在24G左右,不符合預期!

 

解決:

  修改/etc/sysctl.conf內的內核參數kernel.shmall = 65560750 (直接增加一個0   :-)

  sysctl -p 使之生效

  再次創建oracle實例,ok!

 

 

附注:

1.  kernel.shmmax :

是核心參數中最重要的參數之一,用於定義單個共享內存段的最大值。設置應該足夠大,能在一個共享內存段下容納下整個的 SGA , 設置的過低可能會導致需要創建多個共享內存段,這樣可能導致系統性能的下降。至於導致系統下降的主要原因為在實例啟動以及 ServerProcess 創建的時候,多個小的共享內存段可能會導致當時輕微的系統性能的降低 ( 在啟動的時候需要去創建多個虛擬地址段,在進程創建的時候要讓進程對多個段進行“識別”,會有一些影響 ) ,但是其他時候都不會有影響。

官方建議值:

32 位 linux 系統:可取最大值為 4GB ( 4294967296bytes ) -1byte ,即 4294967295 。建議值為多於內存的一半,所以如果是 32 為系統,一般可取值為 429496729532 位系統對 SGA 大小有限制,所以 SGA 肯定可以包含在單個共享內存段中。

64 位 linux 系統:可取的最大值為物理內存值 -1byte ,建議值為多於物理內存的一半,一般取值大於 SGA_MAX_SIZE 即可,可以取物理內存 -1byte 。  

內存為 12G 時,該值為 12*1024*1024*1024-1 = 12884901887

內存為 16G 時,該值為 16*1024*1024*1024-1 = 17179869183

內存為 32G 時,該值為 32*1024*1024*1024-1 = 34359738367

內存為 64G 時,該值為 64*1024*1024*1024-1 = 68719476735

內存為 128G 時,該值為 128*1024*1024*1024-1 = 137438953471

2.  kernel.shmall :

該參數控制可以使用的共享內存的總頁數。 Linux 共享內存頁大小為 4KB, 共享內存段的大小都是共享內存頁大小的整數倍。

一個共享內存段的最大大小是 16G ,那么需要共享內存頁數是 16GB/4KB==4194304 (頁),

當內存為 12G 時, kernel.shmall = 3145728

當內存為 16G 時, kernel.shmall = 4194304

當內次為 32G 時, kernel.shmall = 8388608

當內存為 64G 時, kernel.shmall = 16777216

當內存為 128G 時, kernel.shmall = 33554432
————————————————
版權聲明:本文為CSDN博主「不會推車的娘們」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/shmily_lsl/article/details/103384366

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM