当前位置:首页 > 内存 > 正文

linux共享内存命令

  • 内存
  • 2024-06-02 06:54:21
  • 5448

一、如何设置LINUX的共享内存我们可以修改内核参数shmmax,使SGA存在于共享内存段中。
这个目标可以通过修改/proc/sys/kernel/shmmax参数来实现。
【[root@neirongroot]#echo1073741824>/proc/sys/kernel/shmmax
【[root@neirongroot]#more/proc/sys/kernel/shmmax
<1073741824这里设置为1G。
对于shmmax文件的更改,系统将在重新启动后重置。通过编辑/etc/可以使更改永久生效。
将以下行=1073741824添加到文件中。此更改将在重新启动系统后生效。
1.设置SHMMAX
SHMMAX
该参数设置最大值。共享内存段的大小(以字节为单位)。配置SHMMAX时,请记住SGA的大小必须与共享内存段相对应。SHMMAX设置不足可能会导致以下问题:
ORA-27123:无法附加到共享内存段
您可以通过运行以下命令来确定SHMMAX值:
#cat/proc/sys/kernel/shmmax
33554432
通过直接修改系统/proc文件,您可以无需重新启动计算机即可更改默认SHMMAX设置。我使用的方法是在/etc/启动文件中放入以下命令:
​#>echo"2147483648">/proc/sys/kernel/shmmax
​也可以使用sysctl更改SHMMAX值的命令:
#=2147483648
最后,您可以通过将此内核参数插入到/etc/sysctl启动文件.conf来使此更改永久化:
​#echo"=2147483648">>/etc/
​2.定义SHMMNI
​现在我们看一下SHMMNI设置。该内核设置用于设置系统范围内共享内存段的最大数量。该参数的默认值为4096。该值已足够,一般不需要更改。
您可以通过运行以下命令来确定SHMMNI的值:
#cat/proc/sys/kernel/shmmni
4096
3.设置SHMALL
最后,我们看一下SHMALL共享内存内核设置。此设置控制系统一次可以使用的共享内存总量(以页为单位)。简而言之,该参数的值至少应为:
ceil(SHMMAX/PAGE_SIZE)
SHMALL的默认大小为2097152,可以使用以下命令查询:
#cat/proc/sys/kernel/shmall
​2097152
默认的SHMALL设置对于我们的Oracle9iRAC安装来说应该足够了。
注:RedHatLinux在i386平台上的页面大小为4096字节。但是,您可以使用bigpages,它支持配置更大的内存页面大小。


二、linux可以查看内存使用的命令

1.使用free命令

free命令是Linux系统中最简单、最常用的内存查看命令。

其中,-m选项显示内存使用信息(以MB为单位);

在上面的例子中,Mem:行:

表示总共7822MB物理内存(RAM),即7.6G。

Usage约为322M,表示已使用的物理内存量。

free表示空闲内存;

shared表示共享内存?;

buff/cache表示cache以及Linux系统将缓存的缓冲内存量。当需要显着提高性能时,可以释放该内存以供其他程序使用。

表示可用的可用内存。

2查看/proc/meminfo

另一种方法是读取/proc/meminfo文件。我们知道/proc目录中充满了虚拟文件,其中包含与内核和操作系统相关的动态信息。了解更多Linux知识《这里是如何学习Linux》。

3.使用vmstat命令

使用vmstat-s命令和选项来收集类似于/proc/meminfo的内存使用统计信息。


三、共享内存linux下怎么跑

Linux共享内存实现

说到共享内存,一般来说,人们会想到以下几种方法:
1.多线程。内存在线程之间共享。更准确地说,属于同一进程的线程使用相同的地址空间,而不是在不同地址空间之间共享内存;
2.父进程和子进程之间的内存共享。父进程使用MAP_SHARED|MAP_ANONYMOUS选项映射匿名内存。分叉后,该内存可以在其后代进程之间共享。这种共享内存一般较少使用,因为它受到进程父子关系的限制;
3.映射文件。多个进程mmap到同一个文件,实际上就是共享文件页缓存中的内存。但是文件涉及到磁盘的读写,作为共享内存使用显然是非常麻烦的,所以存在与磁盘无关的内存文件,也就是我们这里要讨论的tmpfs和shmem;

tmpfs是一个虚拟文件系统。其中创建的文件是基于内存的,当机器重新启动时就会消失。
Shmem是一套ipc。通过相应的ipc系统调用shmget,可以以指定的key创建一块共享内存。需要使用这块内存的进程可以通过shmat系统调用来获取。
虽然是两组不同的接口,但是内核中的实现是相同的。shmem内部挂载了一个tmpfs分区(用户不可见),shmget从该分区获取名为“SYSV${key}”的文件。那么shmat就相当于mmap文件。
所以接下来我们将把tmpfs和shmem作为同一件事来讨论。

tmpfs/shmem是介于文件和匿名内存之间的东西。
一方面,它具有文件的属性,可以像文件一样进行作。它有自己的inode和自己的页缓存;
另一方面,它还具有匿名内存的属性。由于没有像磁盘这样的外部存储介质,当内存不足时,内核不能简单地从页面缓存中丢弃页面,而是需要换出;(参见《Linux页面回收简析》)

读写tmpfs/shmem内存就是在页面中对应位置读写该页面所代表的内存缓存。这与普通的文件映射没有什么不同。
如果进程地址空间中的对应位置尚未映射,则建立到页缓存中对应页面的映射;
如果页缓存中的对应位置尚未分配页,将分配一个。当然,由于磁盘上没有源数据,所以新分配的页始终是空的(特别是,当使用read系统调用读取尚未分配页的位置时,不会分配新页,但ZERO_PAGE会被共享);
如果页面缓存中对应位置的页面被回收,则先恢复;

对于第三个“if",tmpfs/shmem和普通文件的页面回收和恢复方式不同:
页面回收时,和普通文件的情况一样,内核会通过prio_tree反向映射找到映射此页面的各个页表,然后将对应的pte转换为clear。
不同的是普通文件的page在保证与磁盘同步后可以被丢弃(如果page脏了则需要flush磁盘),而tmpfs/shmem的page则需要swap-out。
注意,当匿名页面被换出时,它的pte映射并没有被清除,但是必须在pte上填写相应的swap_entry才能知道页面被换出到哪里,否则将需要该页面再次。当时,没有办法换入。
tmpfs/shmem页面呢?页表中对应的pte被清空,swap_entry会被存放到页缓存中radix_tree对应的slot中。

当下次访问触发缺页时,需要恢复页面。
普通文件的页面恢复与未分配页面时相同。需要重新分配页面,然后根据映射的位置再次从磁盘读取相应的数据;
tmpfs/shmem被映射到radix_tree上找到对应的slot,从中获取swap_entry,进行swap-in,将新的page放回pagecache;

这里有问题。如何知道页面缓存的radix_tree的某个槽位中存储着一个正常的页面呢?或者换出后剩下的swap_entry?
如果是swap_entry,则槽中的值将被标记为RADIX_TREE_EXCEPTIONAL_ENTRY(值为2)。swap_entry的值左移两位,并对RADIX_TREE_EXCEPTIONAL_ENTRY进行或运算以填充槽。
也就是说,如果${slot}&RADIX_TREE_EXCEPTIONAL_ENTRY!=0,则代表swap_entry,swap_entry的值为${slot}>>2;否则代表page,${slot}指向pagePointer,当然它的值可能为NULL,表示该page还没有被分配。
显然,页地址值的最后两位必须为0,否则可能与RADIX_TREE_EXCEPTIONAL_ENTRY标记冲突;并且swap_entry的最大值只能是30bit或者62bit(对应32位或者64位机器),否则左移两位就会溢出。

最后用一张图来说明匿名页面、文件映射页面、tmpfs/shmem页面的回收和恢复过程: