有一台CentOS的机器装了Oracle,启动实例的时候报错ORA-27125
SQL> startup
ORA-27125: unable to create shared memory segment
Linux-x86_64 Error: 1: Operation not permitted
Linux详细版本为
# cat /proc/version
Linux version 2.6.32-358.14.1.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Tue Jul 16 23:51:20 UTC 2013
0、解决办法
查询dba用户组的id
# id oracle
uid=502(oracle) gid=503(oinstall) 组=503(oinstall),502(dba)
将dba用户组id添加到文件 /proc/sys/vm/hugetlb_shm_group
# echo 502 > /proc/sys/vm/hugetlb_shm_group
startup数据库实例
SQL> startup
ORACLE instance started.
Total System Global Area 2147483648 bytes
Fixed Size 2022144 bytes
Variable Size 486540544 bytes
Database Buffers 1644167168 bytes
Redo Buffers 14753792 bytes
Database mounted.
Database opened.
1、相关解释
关于hugetlb文件涉及到的相关概念,可以参考这篇文章
When a process uses some memory, the CPU is marking the RAM as used by that process. For efficiency, the CPU allocate RAM by chunks of 4K bytes (it’s the default value on many platforms). Those chunks are named pages. Those pages can be swapped to disk, etc.
Since the process address space are virtual, the CPU and the operating system have to remember which page belong to which process, and where it is stored. Obviously, the more pages you have, the more time it takes to find where the memory is mapped. When a process uses 1GB of memory, that’s 262144 entries to look up (1GB / 4K). If one Page Table Entry consume 8bytes, that’s 2MB (262144 * 8) to look-up.
Most current CPU architectures support bigger pages (so the CPU/OS have less entries to look-up), those are named Huge pages (on Linux), Super Pages (on BSD) or Large Pages (on Windows), but it all the same thing.