1 Linux 的内存机制
在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。
1.1 物理内存和虚拟内存
直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,最佳的情况就是所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。
物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。
作为物理内存的扩展,linux会在物理内存不足时,使用交换分区的虚拟内存,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。
Linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。
1.2 buffers与cached的异同
在Linux 操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从磁盘读入到这些内存中,然后再将数据分发给应用程序;当需要往文件中写数据时,操作系统先分配内存接收用户数据,然后再将数据从内存写到磁盘上。然而,如果有大量数据需要从磁盘读取到内存或者由内存写入磁盘时,系统的读写性 能就变得非常低下,因为无论是从磁盘读数据,还是写数据到磁盘,都是一个很消耗时间和资源的过程,在这种情况下,Linux引入了buffers和 cached机制。
buffers与cached都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers 与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,大大提高了操 作系统的性能。但buffers与cached缓冲的内容却是不同的。
buffers是用来缓冲块设备做的,它只记录文件系统的元数据(metadata)以及 tracking in-flight pages,而cached是用来给文件做缓冲。更通俗一点说:buffers主要用来存放目录里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆我们打开过的文件和程序。
Linux操作系统的内存运行原理,很大程度上是根据服务器的需求来设计的,例如系统的缓冲机制会把经常使用到的文件和数据缓存在cached 中,linux总是在力求缓存更多的数据和信息,这样再次需要这些数据时可以直接从内存中取,而不需要有一个漫长的磁盘操作,这种设计思路提高了系统的整体性能。
1.3 查看Linux 内存信息
可以直接使用free –m 命令来查看:
[root@dave ~]# free -m
total used free shared buffers cached
Mem: 15821 13348 2472 0 337 7088
-/+ buffers/cache: 5923 9898
Swap: 31999 284 31715
[root@dave ~]#
每个选项的含义:
第一行:
total:物理内存的总大小
used:已经使用的物理内存大小
free:空闲的物理内存大小
shared:多个进程共享的内存大小
buffers/cached:磁盘缓存的大小
第二行Mem:代表物理内存使用情况
第三行(-/+ buffers/cached):代表磁盘缓存使用状态
第四行:Swap表示交换空间内存使用状态
free命令输出的内存状态,可以通过两个角度来查看:一个是从内核的角度来看,一个是从应用层的角度来看的
[root@linuxeye ~]# free
total used free shared buffers cached
Mem: 3894036 3473544 420492 0 72972 1332348
-/+ buffers/cache: 2068224 1825812
Swap: 4095992 906036 3189956
1.从内核的角度来查看内存的状态
内核目前可以直接分配到,不需要额外的操作,即为上面free命令输出中第二行Mem项的值,可以看出,此系统物理内存有15821M,空闲的内存只有2472M。总的物理内存减去已经使用的物理内存得到的就是空闲的物理内存大小,注意FREE的内存值并不包含处于buffers和cached状态的内存大小。
Linux会在需要内存的时候,或在系统运行逐步推进时,将buffers和cached状态的内存变为free状态的内存,以供系统使用。
2.从应用层的角度来看系统内存的使用状态
就是Linux上运行的应用程序可以使用的内存大小,即free命令第三行 -/+ buffers/cached 的输出,可以看到,此系统已经使用的内存才5923M,而空闲的内存达到9898M,其由三部分组成:2472+337+7088 = 9897。
应用程序可用的物理内存值是Mem项的free值加上buffers和cached值之和,也就是说,这个free值是包括buffers和cached项大小的,对于应用程序来说,buffers/cached占有的内存是可用的,因为buffers/cached是为了提高文件读取的性能,当应用程序需要用到内存的时候,buffers/cached会很快地被回收,以供应用程序使用。
2 内存与 Oracle 数据库关系
现在的X86 架构都是大内存架构,所以在大内存的情况,有经验的DBA,肯定会设置Huagepage。 当然,也有没有设置的,那么在没有设置Hupgepage的情况下,可能就会出现如下MOS里说的故障:
Linux: Node Reboots After "kernel: INFO: task ocssd.bin: blocked for more than 120 seconds." in /var/log/messages (文档 ID 1423693.1)
这个文章里给的解决方法是设置hugepage 或者在sysctl中设置如下参数:
vm.min_free_kbytes = 51200
vm.swappiness=100
vm.swappiness参数默认为60。取值范围从0到100,当该参数=0,表示只要有可能就尽力避免交换进程移出物理内存; 该参数=100,表示会内核疯狂的将数据移出物理内存移到swap缓存中。 这里是因为内存不够,所以设置成100,所以在实际的环境中,在内存足够的情况下,这个值应该尽可能的低。
vm.min_free_kbytes :/proc/sys/vm/min_free_kbytes
该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。
当可用内存低于这个参数时,系统开始回收cache内存,以释放内存,直到可用内存大于这个值。
vm.vfs_cache_pressure :/proc/sys/vm/vfs_cache_pressure
该文件表示内核回收用于directory和inode cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode cache;增加该值超过100,将导致内核倾向于回收directory和inode cache。
在MOS上还有另外一篇:
ORA-600 [KGHLKREM1] On Linux Using Parameter drop_cache On hugepages Configuration (文档 ID 1070812.1)
在启用hugepage的情况下,如果执行drop_cache 的操作,就可能触发600的错误。
/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing to this file causes the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.
To free pagecache:
* echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
* echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
* echo 3 > /proc/sys/vm/drop_caches
所以在启用hugepage的情况下,尽量避免使用drop cache的功能,可以前面提到的参数:
sysctl -w vm.min_free_kbytes=204800
sysctl -w vm.vfs_cache_pressure=100
sysctl -w vm.swappiness=40
总结,在设置Hupage的情况下,Cache 大一点也无妨,只要没有大量的swap 来影响性能即可。 但在设置hupage的情况,如果想释放更多的cache,那么一定不要手工执行drop cache,应该通过修改参数的方式进行。https://www.cndba.cn/dave/article/206https://www.cndba.cn/dave/article/206