Memory 容量调节
/etc/sysctl.conf
与容量相关的内存可调参数 /proc/sys/vm/
[root@uplook ~]# sysctl -a |grep vm
[root@uplook ~]# yum -y install kernel-doc
[root@uplook ~]# ls /usr/share/doc/kernel-doc-2.6.32/Documentation/sysctl/
00-INDEX abi.txt ctl_unnumbered.txt fs.txt kernel.txt net.txt README sunrpc.txt vm.txt
1. 如何接受大内存分配请求
[root@uplook ~]# sysctl -a |grep vm.overcomm
vm.overcommit_memory = 2
vm.overcommit_ratio = 50 物理内存百分比
vm.overcommit_memory = 0|1|2
-0: 智能识别
-1: 不做任何检查,完全可以分配
-2: 不做超过能力的事
能力:
会将swap + percentage(vm.overcommit_ratio) of the RAM (default 50)作为分给单个进程最大的虚存的最大值
swap + 物理内存的50%(vm.overcommit_ratio值默认是50%,可以超过100%)
swap 8G + 物理内存4G * 50% = 10G
swap 8G + 物理内存4G * 150% = 14G
2. THP设置
nr_hugepages
vm.nr_hugepages = 100 大页设置 sysctl.conf
3. Buffer Cache and Page Cache
drop_caches
- 1 block data To free pagecache 文件系统缓存的实际block数据
- 2 meta data To free dentries and inodes 缓存数据的元数据
- 3 block and meta data To free pagecache, dentries and inodes 所有数据
sysctl -a | grep drop_caches
4. Reclaiming Dirty Pages <Dirty> 脏页回收
脏页:把磁盘上的文件读入到内存中发生修改过的页来还未写回磁盘
[root@uplook ~]# less /proc/meminfo
Free 未分配
Inactive Buffer Cache and Page Cache 但没有修改,这一部分也是可以被分配的
Dirty 如果从磁盘上读出来的文件修改过,但没有存盘
Active 进程正在使用
[root@uplook ~]# grep -i dirt /proc/meminfo
Dirty: 212 kB
方法一:手动回收
[root@uplook ~]# sync 脏页写回磁盘
方法二:由kernel自动回收
vm.dirty_writeback_centisecs kernel每隔多久唤醒flush-MAJOR:MINOR线程,默认为5秒,之用版本为pdflush daemons 数字x10 厘秒
vm.dirty_expire_centisecs 脏页过期时间,单位是1/100秒,即10毫秒,默认为3000,即30秒
vm.dirty_background_ratio(default 10) ratio(比),当系统的内存有10%脏页,kernel会在后台刷脏页
vm.dirty_background_bytes = 0
vm.dirty_ratio(default 40) 脏页有40%,挂起所有进程的写操作,flush脏页,至到10%,例如1G内存,有400M都是脏页
vm.dirty_bytes = 0 到达多少字节 强制刷新
厘秒 1%秒
数字(ratio)越小,I/O压力越大
数据(ratio)越大,I/O压力越小
Out-of-Memory Kill 可调参数
内存不足(OOM)指的是所有可用内存,包括 swap 空间都已被分配的计算状态。默认情况下,这个状态可造成系统 panic,并停止
如预期般工作。但将 /proc/sys/vm/panic_on_oom 参数设定为 0 会让内核在出现 OOM 时调用 oom _killer 功能。通常
oom _killer 可杀死偷盗进程,并让系统正常工作。
sysctl -a | grep panic
panic_on_oom 内存不足是否挂起 不开启挂起杀死进程
[root@uplook ~]# cat /proc/7649/oom_adj
0
[root@uplook ~]# cat /proc/`pgrep sshd`/oom_adj 免死
-17
-16 ----- 15 数据越大,被oom _killer 杀死的可能性越大
-17 将 oom_adj 值设定为 -17 则为该进程禁用 oom _killer
杀进程可能导致数据丢失
与容量相关的内存可调参数 /proc/sys/kernel/
==消息对列==
kernel.msgmax
以字节为单位规定信息队列中任意信息的最大允许大小。这个值一定不能超过该队列的大小
(msgmnb)。默认值为 65536。
kernel.msgmnb
以字节为单位规定单一信息队列的最大值。默认为 65536 字节。
msgmni
规定信息队列识别符的最大数量(以及队列的最大数量)。64 位架构机器的默认值为 1985; 32位架构机器的默认值为 1736。
==共享内存==
shmall
以字节为单位规定一次在该系统中可以使用的共享内存总量。64 位架构机器的默认值为
4 294 967296;32 位架构机器的默认值为 2684 354 56。
shmmax
以字节为单位规定内核可允许的最大共享内存片段。64 位架构机器的默认值为 68719476736;
32 位架构机器的默认值为 4294967295。注:但内核支持的值比这个值要多得多。
shmmni
规定系统范围内最小共享内存片段。在 64 位和 32 位架构机器中的默认值都是 4096。
[root@uplook ~]# ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x6c6c6536 0 root 600 4096 0
0x00000000 1867777 root 600 393216 2 dest
0x00000000 1900546 root 600 393216 2 dest
0x00000000 1933315 root 600 393216 2 dest
------ Semaphore Arrays --------
key semid owner perms nsems
0x00000000 0 root 600 1
0x00000000 32769 root 600 1
0x00000000 786434 apache 600 1
0x00000000 819203 apache 600 1
------ Message Queues --------
key msqid owner perms used-bytes messages
甲骨文配置建议值
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 4294967295
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576