Linux 的内存管理工具和调优参数
生活随笔
收集整理的這篇文章主要介紹了
Linux 的内存管理工具和调优参数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. free
2. top
3. vmstat
4. slabtop;
5. pmap
6. dmesg
7. /proc/meminfo
8. /proc/sys/vm 目錄下的文件
9. sync
10./proc/zoneinfo?
free - Display amount of free and used memory in the system
root@ubuntu:/home/ricky# free -h
? ? ? ? ? ? ?total ? ? ? used ? ? ? free ? ? shared ? ?buffers ? ? cached
Mem: ? ? ? ? ?2.0G ? ? ? 712M ? ? ? 1.3G ? ? ? 7.3M ? ? ? ?43M ? ? ? 296M
-/+ buffers/cache: ? ? ? 371M ? ? ? 1.6G
Swap: ? ? ? ? 2.0G ? ? ? ? 0B ? ? ? 2.0G
//shared: 共享內存
//buffers: block buffers
//cached: ?page cache
??
2.top
top - 05:49:21 up 18 min, ?2 users, ?load average: 0.07, 0.18, 0.30
Tasks: 193 total, ? 1 running, 192 sleeping, ? 0 stopped, ? 0 zombie
%Cpu(s): ?2.4 us, ?6.0 sy, ?0.9 ni, 87.0 id, ?3.6 wa, ?0.0 hi, ?0.1 si, ?0.0 st
KiB Mem: ? 2063844 total, ?1093352 used, ? 970492 free, ? 134932 buffers
KiB Swap: ?2094076 total, ? ? ? ?0 used, ?2094076 free. ? 519908 cached Mem
? PID USER ? ? ?PR ?NI ? ?VIRT ? ?RES ? ?SHR S ?%CPU %MEM ? ? TIME+ COMMAND
?4068 root ? ? ?20 ? 0 ? ?5424 ? 1332 ? ?988 R ?11.9 ?0.1 ? 0:00.03 top
?1065 root ? ? ?20 ? 0 ?181812 ?37872 ?17900 S ? 6.0 ?1.8 ? 0:25.80 Xorg
? ? 1 root ? ? ?20 ? 0 ? ?4600 ? 2584 ? 1444 S ? 0.0 ?0.1 ? 0:03.88 init
? ? 2 root ? ? ?20 ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.00 kthreadd
? ? 3 root ? ? ?20 ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.43 ksoftirqd/0
? ? 5 root ? ? ? 0 -20 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.00 kworker/0:0H
? ? 7 root ? ? ?20 ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:04.06 rcu_sched
? ? 8 root ? ? ?20 ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.00 rcu_bh
? ? 9 root ? ? ?rt ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.85 migration/0
? ?10 root ? ? ?rt ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.86 watchdog/0
? ?11 root ? ? ?rt ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.18 watchdog/1
? ?12 root ? ? ?rt ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.14 migration/1
? ?13 root ? ? ?20 ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.26 ksoftirqd/1
? ?14 root ? ? ?20 ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.00 kworker/1:0
? ?15 root ? ? ? 0 -20 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.00 kworker/1:0H
top是可交互的命令工具
按下A/M/N/P/T可以進行排序,如下:
?SORTING of task window
? ? ? ? ?For ?compatibility, ?this top supports most of the former top sort keys. ?Since this is primarily a service to former top
? ? ? ? ?users, these commands do not appear on any help screen.
? ? ? ? ? ? command ? sorted-field ? ? ? ? ? ? ? ? ?supported
? ? ? ? ? ? ? A ? ? ? ? start time (non-display) ? ? ?No
? ? ? ? ? ? ? M ? ? ? ? %MEM ? ? ? ? ? ? ? ? ? ? ? ? ?Yes
? ? ? ? ? ? ? N ? ? ? ? PID ? ? ? ? ? ? ? ? ? ? ? ? ? Yes
? ? ? ? ? ? ? P ? ? ? ? %CPU ? ? ? ? ? ? ? ? ? ? ? ? ?Yes
? ? ? ? ? ? ? T ? ? ? ? TIME+ ? ? ? ? ? ? ? ? ? ? ? ? Yes
按下f鍵(Fields)可以打開或者關閉指定的列,如下,
Fields Management for window 1:Def, whose current sort field is TIME+
? ?Navigate with Up/Dn, Right selects for move then <Enter> or Left commits,
? ?'d' or <Space> toggles display, 's' sets sort. ?Use 'q' or <Esc> to end!
* PID ? ? = Process Id ? ? ? ? ? ? ENVIRON = Environment vars ? ?
* USER ? ?= Effective User Name ? ?vMj ? ? = Major Faults delta ?
* PR ? ? ?= Priority ? ? ? ? ? ? ? vMn ? ? = Minor Faults delta ?
* NI ? ? ?= Nice Value ? ? ? ? ? ? USED ? ?= Res+Swap Size (KiB)?
* VIRT ? ?= Virtual Image (KiB) ? ?nsIPC ? = IPC namespace Inode?
* RES ? ? = Resident Size (KiB) ? ?nsMNT ? = MNT namespace Inode?
* SHR ? ? = Shared Memory (KiB) ? ?nsNET ? = NET namespace Inode?
* S ? ? ? = Process Status ? ? ? ? nsPID ? = PID namespace Inode?
* %CPU ? ?= CPU Usage ? ? ? ? ? ? ?nsUSER ?= USER namespace Inode
* %MEM ? ?= Memory Usage (RES) ? ? nsUTS ? = UTS namespace Inode?
* TIME+ ? = CPU Time, hundredths
* COMMAND = Command Name/Line ??
? PPID ? ?= Parent Process pid ?
? UID ? ? = Effective User Id ??
? RUID ? ?= Real User Id ? ? ? ?
? RUSER ? = Real User Name ? ? ?
? SUID ? ?= Saved User Id ? ? ??
? SUSER ? = Saved User Name ? ??
? GID ? ? = Group Id ? ? ? ? ? ?
? GROUP ? = Group Name ? ? ? ? ?
? PGRP ? ?= Process Group Id ? ?
? TTY ? ? = Controlling Tty ? ??
? TPGID ? = Tty Process Grp Id ?
? SID ? ? = Session Id ? ? ? ? ?
? nTH ? ? = Number of Threads ??
? P ? ? ? = Last Used Cpu (SMP)?
? TIME ? ?= CPU Time ? ? ? ? ? ?
? SWAP ? ?= Swapped Size (KiB) ?
? CODE ? ?= Code Size (KiB) ? ??
? DATA ? ?= Data+Stack (KiB) ? ?
? nMaj ? ?= Major Page Faults ??
? nMin ? ?= Minor Page Faults ??
? nDRT ? ?= Dirty Pages Count ??
? WCHAN ? = Sleeping in Function
? Flags ? = Task Flags <sched.h>
? CGROUPS = Control Groups ? ? ?
? SUPGIDS = Supp Groups IDs ? ??
? SUPGRPS = Supp Groups Names ??
? TGID ? ?= Thread Group Id ?
??
? 其中如下幾個filed 與內存有關。
? SWAP ? ?= Swapped Size (KiB) ?
? CODE ? ?= Code Size (KiB) ? ??
? DATA ? ?= Data+Stack (KiB) ? ?
? nMaj ? ?= Major Page Faults ??
? nMin ? ?= Minor Page Faults ??
? nDRT ? ?= Dirty Pages Count?
??
page fault 又分為幾種,major page fault、 minor page fault、 invalid(segment fault)。
major page fault也稱為hard page fault, 指需要訪問的內存不在虛擬地址空間,也不在物理內存中,需要從慢速設備載入。從swap回到物理內存也是hard page fault。
minor page fault也稱為soft page fault, 指需要訪問的內存不在虛擬地址空間,但是在物理內存中,只需要MMU建立物理內存和虛擬地址空間的映射關系即可。?
(通常是多個進程訪問同一個共享內存中的數據,可能某些進程還沒有建立起映射關系,所以訪問時會出現soft page fault)
invalid fault也稱為segment fault, 指進程需要訪問的內存地址不在它的虛擬地址空間范圍內,屬于越界訪問,內核會報segment fault錯誤。
3.vmstat
vmstat - Report virtual memory statistics
root@ubuntu:/home/ricky# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
?r ?b ? swpd ? free ? buff ?cache ? si ? so ? ?bi ? ?bo ? in ? cs us sy id wa st
?0 ?0 ? ? ?0 980532 134948 520236 ? ?0 ? ?0 ? ?34 ? ?10 ? 41 ? 70 ?1 ?1 98 ?0 ?0
?
? ? Memory
? ? ? ?swpd: the amount of virtual memory used.
? ? ? ?free: the amount of idle memory.
? ? ? ?buff: the amount of memory used as buffers.
? ? ? ?cache: the amount of memory used as cache.
? ? ? ?inact: the amount of inactive memory. ?(-a option)
? ? ? ?active: the amount of active memory. ?(-a option)
? ?Swap
? ? ? ?si: Amount of memory swapped in from disk (/s).
? ? ? ?so: Amount of memory swapped to disk (/s).
?
?4. slabtop
?slabtop - display kernel slab cache information in real time
?/proc/slabinfo
?
?Active / Total Objects (% used) ? ?: 350745 / 352998 (99.4%)
?Active / Total Slabs (% used) ? ? ?: 7986 / 7986 (100.0%)
?Active / Total Caches (% used) ? ? : 67 / 96 (69.8%)
?Active / Total Size (% used) ? ? ? : 59301.82K / 59760.34K (99.2%)
?Minimum / Average / Maximum Object : 0.01K / 0.17K / 8.00K
? OBJS ACTIVE ?USE OBJ SIZE ?SLABS OBJ/SLAB CACHE SIZE NAME
?70944 ?70944 100% ? ?0.12K ? 2217 ? ? ? 32 ? ? ?8868K dentry
?62342 ?62342 100% ? ?0.05K ? ?854 ? ? ? 73 ? ? ?3416K buffer_head
?40742 ?40742 100% ? ?0.61K ? 1567 ? ? ? 26 ? ? 25072K ext4_inode_cache
?34752 ?34483 ?99% ? ?0.06K ? ?543 ? ? ? 64 ? ? ?2172K kmalloc-64
?21252 ?21156 ?99% ? ?0.09K ? ?506 ? ? ? 42 ? ? ?2024K kmalloc-96
?19840 ?18831 ?94% ? ?0.03K ? ?155 ? ? ?128 ? ? ? 620K kmalloc-32
?19456 ?19456 100% ? ?0.03K ? ?152 ? ? ?128 ? ? ? 608K ext4_extent_status
?13568 ?13568 100% ? ?0.02K ? ? 53 ? ? ?256 ? ? ? 212K kmalloc-16
?10212 ?10212 100% ? ?0.34K ? ?444 ? ? ? 23 ? ? ?3552K inode_cache
? 8704 ? 8704 100% ? ?0.03K ? ? 68 ? ? ?128 ? ? ? 272K anon_vma
? 7875 ? 7745 ?98% ? ?0.19K ? ?375 ? ? ? 21 ? ? ?1500K kmalloc-192
? 7168 ? 7168 100% ? ?0.01K ? ? 14 ? ? ?512 ? ? ? ?56K kmalloc-8
? 6205 ? 6205 100% ? ?0.05K ? ? 73 ? ? ? 85 ? ? ? 292K Acpi-State
? 5772 ? 5772 100% ? ?0.30K ? ?222 ? ? ? 26 ? ? ?1776K radix_tree_node
? 4420 ? 4420 100% ? ?0.02K ? ? 26 ? ? ?170 ? ? ? 104K nsproxy
? 3654 ? 3598 ?98% ? ?0.37K ? ?174 ? ? ? 21 ? ? ?1392K proc_inode_cache
?
?5. pmap
? pmap - report memory map of a process
? root@ubuntu:/home/ricky/code# pmap 5162
5162: ? ./a.out
08048000 ? ? ?4K r-x-- a.out
08049000 ? ? ?4K r---- a.out
0804a000 ? ? ?4K rw--- a.out
b756a000 ? ?408K rw--- ? [ anon ]
b75d0000 ? 1700K r-x-- libc-2.19.so
b7779000 ? ? ?8K r---- libc-2.19.so
b777b000 ? ? ?4K rw--- libc-2.19.so
b777c000 ? ? 12K rw--- ? [ anon ]
b7794000 ? ? ?8K rw--- ? [ anon ]
b7796000 ? ? ?4K r-x-- ? [ anon ]
b7797000 ? ?128K r-x-- ld-2.19.so
b77b7000 ? ? ?4K r---- ld-2.19.so
b77b8000 ? ? ?4K rw--- ld-2.19.so
bfdaf000 ? ?132K rw--- ? [ stack ]
?total ? ? 2424K
?6.dmesg
? dmesg - print or control the kernel ring buffer
? 顯示內核啟動的日志 - 內存相關log:
?1 [ ? ?0.000000] PERCPU: Embedded 14 pages/cpu @f7b82000 s36096 r0 d21248 u57344
? ? ? 2 [ ? ?0.000000] pcpu-alloc: s36096 r0 d21248 u57344 alloc=14*4096
? ? ? 3 [ ? ?0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3 [0] 4 [0] 5 [0] 6 [0] 7
? ? ? 4 [ ? ?0.000000] Built 1 zonelists in Zone order, mobility grouping on. ?Total pages: 522373
? ? ? 5 [ ? ?0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-3.13.0-32-generic root=UUID=80483beb-4610-4202-8e4f-6e3774c72ce6 ? ? ? ? ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet
? ? ? 6 [ ? ?0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)
? ? ? 7 [ ? ?0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
? ? ? 8 [ ? ?0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
? ? ? 9 [ ? ?0.000000] Initializing CPU#0
? ? ?10 [ ? ?0.000000] xsave: enabled xstate_bv 0x3, cntxt size 0x240
? ? ?11 [ ? ?0.000000] allocated 4194296 bytes of page_cgroup
? ? ?12 [ ? ?0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups
? ? ?13 [ ? ?0.000000] Initializing HighMem for node 0 (00037bfe:00080000)
? ? ?14 [ ? ?0.000000] Memory: 2044664K/2096628K available (6528K kernel code, 639K rwdata, 2760K rodata, 872K init, 924K bss, 51964K ? ? ? ? reserved, 1183624K highmem)
? ? ?15 [ ? ?0.000000] virtual kernel memory layout:
? ? ?16 [ ? ?0.000000] ? ? fixmap ?: 0xfff14000 - 0xfffff000 ? ( 940 kB)
? ? ?17 [ ? ?0.000000] ? ? pkmap ? : 0xffc00000 - 0xffe00000 ? (2048 kB)
? ? ?18 [ ? ?0.000000] ? ? vmalloc : 0xf83fe000 - 0xffbfe000 ? ( 120 MB)
? ? ?19 [ ? ?0.000000] ? ? lowmem ?: 0xc0000000 - 0xf7bfe000 ? ( 891 MB)
? ? ?20 [ ? ?0.000000] ? ? ? .init : 0xc19b4000 - 0xc1a8e000 ? ( 872 kB)
? ? ?21 [ ? ?0.000000] ? ? ? .data : 0xc1660532 - 0xc19b3e80 ? (3406 kB)
? ? ?22 [ ? ?0.000000] ? ? ? .text : 0xc1000000 - 0xc1660532 ? (6529 kB)
?7. cat /proc/meminfo
?root@ubuntu:/proc# cat meminfo
MemTotal: ? ? ? ?2063844 kB
MemFree: ? ? ? ? ?746660 kB
Buffers: ? ? ? ? ?138740 kB
Cached: ? ? ? ? ? 656536 kB
SwapCached: ? ? ? ? ? ?0 kB
Active: ? ? ? ? ? 763260 kB
Inactive: ? ? ? ? 446108 kB
Active(anon): ? ? 415072 kB
Inactive(anon): ? ?10880 kB
Active(file): ? ? 348188 kB
Inactive(file): ? 435228 kB
Unevictable: ? ? ? ? ?32 kB
Mlocked: ? ? ? ? ? ? ?32 kB
HighTotal: ? ? ? 1183624 kB
HighFree: ? ? ? ? 489896 kB
LowTotal: ? ? ? ? 880220 kB
LowFree: ? ? ? ? ?256764 kB
SwapTotal: ? ? ? 2094076 kB
SwapFree: ? ? ? ?2094076 kB
Dirty: ? ? ? ? ? ? ? ? 0 kB
Writeback: ? ? ? ? ? ? 0 kB
AnonPages: ? ? ? ?414204 kB
Mapped: ? ? ? ? ? 155944 kB
Shmem: ? ? ? ? ? ? 11864 kB
Slab: ? ? ? ? ? ? ?61084 kB
SReclaimable: ? ? ?45424 kB
SUnreclaim: ? ? ? ?15660 kB
KernelStack: ? ? ? ?3160 kB
PageTables: ? ? ? ? 7428 kB
NFS_Unstable: ? ? ? ? ?0 kB
Bounce: ? ? ? ? ? ? ? ?0 kB
WritebackTmp: ? ? ? ? ?0 kB
CommitLimit: ? ? 3125996 kB?
Committed_AS: ? ?2766012 kB
VmallocTotal: ? ? 122880 kB
VmallocUsed: ? ? ? 23744 kB
VmallocChunk: ? ? ?61636 kB
HardwareCorrupted: ? ? 0 kB
AnonHugePages: ? ?186368 kB
HugePages_Total: ? ? ? 0
HugePages_Free: ? ? ? ?0
HugePages_Rsvd: ? ? ? ?0
HugePages_Surp: ? ? ? ?0
Hugepagesize: ? ? ? 2048 kB
DirectMap4k: ? ? ? 28664 kB
DirectMap2M: ? ? ?884736 kB
CommitLimit:CommitLimit
可以參考:
http://www.firefoxbug.com/index.php/archives/2800/
?8. /proc/sys/vm 目錄下的文件
?root@ubuntu:/proc/sys/vm# ll
total 0
dr-xr-xr-x 1 root root 0 Jun 10 05:31 ./
dr-xr-xr-x 1 root root 0 Jun 10 05:31 ../
-rw-r--r-- 1 root root 0 Jun 10 09:18 admin_reserve_kbytes
-rw-r--r-- 1 root root 0 Jun 10 09:18 block_dump
--w------- 1 root root 0 Jun 10 09:18 compact_memory
-rw-r--r-- 1 root root 0 Jun 10 09:18 dirty_background_bytes
-rw-r--r-- 1 root root 0 Jun 10 05:32 dirty_background_ratio
-rw-r--r-- 1 root root 0 Jun 10 09:18 dirty_bytes
-rw-r--r-- 1 root root 0 Jun 10 09:18 dirty_expire_centisecs
-rw-r--r-- 1 root root 0 Jun 10 05:32 dirty_ratio
-rw-r--r-- 1 root root 0 Jun 10 05:32 dirty_writeback_centisecs
-rw-r--r-- 1 root root 0 Jun 10 09:18 drop_caches
-rw-r--r-- 1 root root 0 Jun 10 09:18 extfrag_threshold
-rw-r--r-- 1 root root 0 Jun 10 09:18 highmem_is_dirtyable
-rw-r--r-- 1 root root 0 Jun 10 09:18 hugepages_treat_as_movable
-rw-r--r-- 1 root root 0 Jun 10 09:18 hugetlb_shm_group
-rw-r--r-- 1 root root 0 Jun 10 05:32 laptop_mode
-rw-r--r-- 1 root root 0 Jun 10 09:18 legacy_va_layout
-rw-r--r-- 1 root root 0 Jun 10 09:18 lowmem_reserve_ratio
-rw-r--r-- 1 root root 0 Jun 10 09:18 max_map_count
-rw-r--r-- 1 root root 0 Jun 10 09:18 memory_failure_early_kill
-rw-r--r-- 1 root root 0 Jun 10 09:18 memory_failure_recovery
-rw-r--r-- 1 root root 0 Jun 10 09:18 min_free_kbytes
-rw-r--r-- 1 root root 0 Jun 10 05:31 mmap_min_addr
-rw-r--r-- 1 root root 0 Jun 10 09:18 nr_hugepages
-rw-r--r-- 1 root root 0 Jun 10 09:18 nr_overcommit_hugepages
-r--r--r-- 1 root root 0 Jun 10 09:18 nr_pdflush_threads
-rw-r--r-- 1 root root 0 Jun 10 09:18 oom_dump_tasks
-rw-r--r-- 1 root root 0 Jun 10 09:18 oom_kill_allocating_task
-rw-r--r-- 1 root root 0 Jun 10 05:31 overcommit_memory
-rw-r--r-- 1 root root 0 Jun 10 09:18 overcommit_ratio
-rw-r--r-- 1 root root 0 Jun 10 09:18 page-cluster
-rw-r--r-- 1 root root 0 Jun 10 09:18 panic_on_oom
-rw-r--r-- 1 root root 0 Jun 10 09:18 percpu_pagelist_fraction
-rw-r--r-- 1 root root 0 Jun 10 09:18 scan_unevictable_pages
-rw-r--r-- 1 root root 0 Jun 10 09:18 stat_interval
-rw-r--r-- 1 root root 0 Jun 10 09:18 swappiness
-rw-r--r-- 1 root root 0 Jun 10 09:18 user_reserve_kbytes
-rw-r--r-- 1 root root 0 Jun 10 09:18 vdso_enabled
-rw-r--r-- 1 root root 0 Jun 10 09:18 vfs_cache_pressure
解釋:
swappiness:
(0~100), 該值越高則linux越傾向于將部分長期沒有用到的頁swap到交換磁盤。
swappiness=0,不會交換匿名頁面到交換磁盤,除非系統內存非常低
swappiness=100, 內核積極回收匿名頁面。
panic_on_oom:
用于控制如何處理out-of-memory,可選值包括0/1/2
0:當內存不足時內核調用OOM killer殺死一些rogue進程,每個進程描述符都有一個oom_score標示,oom killer會選擇oom_score較大的進程
1:發生了OOM以后,如果有mempolicy/cpusets的進程限制,而這些nodes導致了內存問題的時候,OOM Killer會干掉這些中的一個,系統也會恢復
2:OOM后必然panic
備注:每個進程有一個oom_score_adj (取值范圍:-1000 - 1000)與此參數有關,-1000表示不會被oom killer選中。
舊版本中用的是oom_adj(-17,15),不過oom_adj逐漸會被oom_score_adj 取代。
比如:
cat /proc/<pid>/oom_score_adj
如下鏈接非常重要:
https://www.cnblogs.com/tolimit/p/5065761.html
admin_reserve_kbytes:給有cap_sys_admin權限的用戶保留的內存數量(默認值是 min(free_page * 0.03, 8MB))
drop_caches:
寫入數值可以使內核釋放page_cache,dentries和inodes緩存所占的內存。
1:只釋放page_cache
2:只釋放dentries和inodes緩存
3:釋放page_cache、dentries和inodes緩存
oom_dump_tasks
如果啟用,在內核執行OOM-killing時會打印系統內進程的信息(不包括內核線程),信息包括pid、uid、tgid、vm size、rss、nr_ptes,swapents,oom_score_adj和進程名稱。這些信息可以幫助找出為什么OOM killer被執行,找到導致OOM的進程,以及了解為什么進程會被選中。
0:不打印系統內進程信息
1:打印系統內進程信息
memory_failure_early_kill:
控制發生某個內核無法處理的內存錯誤發生的時候,如何去殺掉這個進程。當這些錯誤頁有swap鏡像的時候,內核會很好的處理這個錯誤,不會影響任何應用程序,但是如果沒有的話,內核會把進程殺掉,避免內存錯誤的擴大
1:在發現內存錯誤的時候,就會把所有擁有此內存頁的進程都殺掉
0:只是對這部分頁進行unmap,然后把第一個試圖進入這個頁的進程殺掉
memory_failure_recovery:
是否開啟內存錯誤恢復機制
1:開啟
0:一旦出現內存錯誤,就panic
https://blog.csdn.net/joyeu/article/details/20063429
min_free_kbytes:代表系統所保留空閑內存的最低限,在系統初始化時會根據內存大小計算一個默認值,計算規則是:
min_free_kbytes = sqrt(lowmem_kbytes * 16) = 4 * sqrt(lowmem_kbytes)(注:lowmem_kbytes即可認為是系統內存大小)
min_free_kbytes的主要用途是計算影響內存回收的三個參數 watermark[min/low/high]
?三個watermark的計算方法:
?watermark[min] = min_free_kbytes換算為page單位即可,假設為min_free_pages。
?因為是每個zone各有一套watermark參數,實際計算效果是根據各個zone大小所占內存總大小的比例,而算出來的per zone min_free_pages)
?watermark[low] = watermark[min] * 5 / 4
?watermark[high] = watermark[min] * 3 / 2
https://blog.csdn.net/joyeu/article/details/20063429
lowmem_reserve_ratio
1.作用
除了min_free_kbytes會在每個zone上預留一部分內存外,lowmem_reserve_ratio是在各個zone之間進行一定的防衛預留,主要是防止高端zone在沒內存的情況下過度使用低端zone的內存資源。
例如現在常見的一個node的機器有三個zone: DMA,DMA32和NORMAL。DMA和DMA32屬于低端zone,內存也較小,如96G內存的機器兩個zone總和才1G左右,NORMAL就相對屬于高端內存(現在一般沒有HIGH zone),而且數量較大(>90G)。低端內存有一定的特殊作用比如發生DMA時只能分配DMA zone的低端內存,因此需要在 盡量可以使用高端內存時 而 不使用低端內存,同時防止高端內存分配不足的時候搶占稀有的低端內存
?
http://www.firefoxbug.com/index.php/archives/2800/
overcommit_memory:
0 — 默認設置。個人理解:當應用進程嘗試申請內存時,內核會做一個檢測。內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,并把錯誤返回給應用進程。舉個例子,比如1G的機器,A進程已經使用了500M,當有另外進程嘗試malloc 500M的內存時,內核就會進行check,發現超出剩余可用內存,就會提示失敗。
1 — 對于內存的申請請求,內核不會做任何check,直到物理內存用完,觸發OOM殺用戶態進程。同樣是上面的例子,1G的機器,A進程500M,B進程嘗試malloc 500M,會成功,但是一旦kernel發現內存使用率接近1個G(內核有策略),就觸發OOM,殺掉一些用戶態的進程(有策略的殺)。
2 — 當請求申請的內存 >= SWAP內存大小 + 物理內存 * ?N,則拒絕此次內存申請。
解釋下這個N:N是一個百分比,根據overcommit_ratio/100來確定,比如overcommit_ratio=50,那么N就是50%。
overcommit_ratio:
只有當vm.overcommit_memory = 2的時候才會生效,內存可申請內存為
SWAP內存大小 + 物理內存 * overcommit_ratio/100
percpu_pagelist_fraction:
每個CPU能從每個zone所能分配到的pages的最大值(單位每個zone的1/X),0為不限制
9. sync
NAME
? ? ? ?sync - flush file system buffers
DESCRIPTION
? ? ? ?Force changed blocks to disk, update the super block.
??
11./proc/pagetypeinfo
root@ubuntu:/usr/local# cat /proc/pagetypeinfo
Page block order: 9
Pages per block: ?512
Free pages count per migrate type at order ? ? ? 0 ? ? ?1 ? ? ?2 ? ? ?3 ? ? ?4 ? ? ?5 ? ? ?6 ? ? ?7 ? ? ?8 ? ? ?9 ? ? 10?
Node ? ?0, zone ? ? ?DMA, type ? ?Unmovable ? ? ?1 ? ? ?1 ? ? ?3 ? ? ?0 ? ? ?0 ? ? ?1 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ? ? ?DMA, type ?Reclaimable ? ? ?1 ? ? ?1 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?1 ? ? ?1 ? ? ?0 ? ? ?1 ? ? ?1 ? ? ?0?
Node ? ?0, zone ? ? ?DMA, type ? ? ?Movable ? ? ?2 ? ? ?1 ? ? ?1 ? ? ?0 ? ? ?0 ? ? ?1 ? ? ?0 ? ? ?1 ? ? ?1 ? ? ?0 ? ? ?0?
Node ? ?0, zone ? ? ?DMA, type ? ? ?Reserve ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?1 ? ? ?0?
Node ? ?0, zone ? ? ?DMA, type ? ? ? ? ?CMA ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ? ? ?DMA, type ? ? ?Isolate ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ? Normal, type ? ?Unmovable ? ? ?7 ? ? ?1 ? ? ?0 ? ? ?0 ? ? ?3 ? ? ?7 ? ? 12 ? ? ?9 ? ? ?3 ? ? ?0 ? ? ?0?
Node ? ?0, zone ? Normal, type ?Reclaimable ? ? ?1 ? ? ?1 ? ? ?3 ? ? ?2 ? ? ?2 ? ? ?0 ? ? ?1 ? ? ?0 ? ? ?0 ? ? ?1 ? ? ?0?
Node ? ?0, zone ? Normal, type ? ? ?Movable ? ?136 ? ? 90 ? ? 63 ? ? 13 ? ? ?1 ? ? ?0 ? ? ?7 ? ? ?3 ? ? ?2 ? ? ?0 ? ? 78?
Node ? ?0, zone ? Normal, type ? ? ?Reserve ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?1?
Node ? ?0, zone ? Normal, type ? ? ? ? ?CMA ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ? Normal, type ? ? ?Isolate ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ?HighMem, type ? ?Unmovable ? ? ?0 ? ? ?1 ? ? ?0 ? ? ?7 ? ? 21 ? ? 11 ? ? ?8 ? ? ?8 ? ? ?2 ? ? ?2 ? ? ?2?
Node ? ?0, zone ?HighMem, type ?Reclaimable ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ?HighMem, type ? ? ?Movable ? ? 27 ? ? 27 ? ? 42 ? ? 13 ? ? 24 ? ? ?8 ? ? ?5 ? ? ?2 ? ? ?3 ? ? ?5 ? ?148?
Node ? ?0, zone ?HighMem, type ? ? ?Reserve ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?1?
Node ? ?0, zone ?HighMem, type ? ? ? ? ?CMA ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ?HighMem, type ? ? ?Isolate ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Number of blocks type ? ? Unmovable ?Reclaimable ? ? ?Movable ? ? ?Reserve ? ? ? ? ?CMA ? ? ?Isolate?
Node 0, zone ? ? ?DMA ? ? ? ? ? ?1 ? ? ? ? ? ?2 ? ? ? ? ? ?4 ? ? ? ? ? ?1 ? ? ? ? ? ?0 ? ? ? ? ? ?0?
Node 0, zone ? Normal ? ? ? ? ? 44 ? ? ? ? ? 24 ? ? ? ? ?368 ? ? ? ? ? ?2 ? ? ? ? ? ?0 ? ? ? ? ? ?0?
Node 0, zone ?HighMem ? ? ? ? ? 23 ? ? ? ? ? ?0 ? ? ? ? ?555 ? ? ? ? ? ?1 ? ? ? ? ? ?0 ? ? ? ? ? ?0?
12. oom killer
人為制造一個oom killer:
echo f > /proc/sysrq-trigger
另外,向sysrq寫入命令的幫助文件如下,上例中寫入的f: memory-full-oom-kill(f),也就是執行oom kill
SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) show-blocked-tasks(w) dump-ftrace-buffer(z)
2. top
3. vmstat
4. slabtop;
5. pmap
6. dmesg
7. /proc/meminfo
8. /proc/sys/vm 目錄下的文件
9. sync
10./proc/zoneinfo?
11./proc/pagetypeinfo
查看內存工具:
1.freefree - Display amount of free and used memory in the system
root@ubuntu:/home/ricky# free -h
? ? ? ? ? ? ?total ? ? ? used ? ? ? free ? ? shared ? ?buffers ? ? cached
Mem: ? ? ? ? ?2.0G ? ? ? 712M ? ? ? 1.3G ? ? ? 7.3M ? ? ? ?43M ? ? ? 296M
-/+ buffers/cache: ? ? ? 371M ? ? ? 1.6G
Swap: ? ? ? ? 2.0G ? ? ? ? 0B ? ? ? 2.0G
//shared: 共享內存
//buffers: block buffers
//cached: ?page cache
??
2.top
top - 05:49:21 up 18 min, ?2 users, ?load average: 0.07, 0.18, 0.30
Tasks: 193 total, ? 1 running, 192 sleeping, ? 0 stopped, ? 0 zombie
%Cpu(s): ?2.4 us, ?6.0 sy, ?0.9 ni, 87.0 id, ?3.6 wa, ?0.0 hi, ?0.1 si, ?0.0 st
KiB Mem: ? 2063844 total, ?1093352 used, ? 970492 free, ? 134932 buffers
KiB Swap: ?2094076 total, ? ? ? ?0 used, ?2094076 free. ? 519908 cached Mem
? PID USER ? ? ?PR ?NI ? ?VIRT ? ?RES ? ?SHR S ?%CPU %MEM ? ? TIME+ COMMAND
?4068 root ? ? ?20 ? 0 ? ?5424 ? 1332 ? ?988 R ?11.9 ?0.1 ? 0:00.03 top
?1065 root ? ? ?20 ? 0 ?181812 ?37872 ?17900 S ? 6.0 ?1.8 ? 0:25.80 Xorg
? ? 1 root ? ? ?20 ? 0 ? ?4600 ? 2584 ? 1444 S ? 0.0 ?0.1 ? 0:03.88 init
? ? 2 root ? ? ?20 ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.00 kthreadd
? ? 3 root ? ? ?20 ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.43 ksoftirqd/0
? ? 5 root ? ? ? 0 -20 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.00 kworker/0:0H
? ? 7 root ? ? ?20 ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:04.06 rcu_sched
? ? 8 root ? ? ?20 ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.00 rcu_bh
? ? 9 root ? ? ?rt ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.85 migration/0
? ?10 root ? ? ?rt ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.86 watchdog/0
? ?11 root ? ? ?rt ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.18 watchdog/1
? ?12 root ? ? ?rt ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.14 migration/1
? ?13 root ? ? ?20 ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.26 ksoftirqd/1
? ?14 root ? ? ?20 ? 0 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.00 kworker/1:0
? ?15 root ? ? ? 0 -20 ? ? ? 0 ? ? ?0 ? ? ?0 S ? 0.0 ?0.0 ? 0:00.00 kworker/1:0H
top是可交互的命令工具
按下A/M/N/P/T可以進行排序,如下:
?SORTING of task window
? ? ? ? ?For ?compatibility, ?this top supports most of the former top sort keys. ?Since this is primarily a service to former top
? ? ? ? ?users, these commands do not appear on any help screen.
? ? ? ? ? ? command ? sorted-field ? ? ? ? ? ? ? ? ?supported
? ? ? ? ? ? ? A ? ? ? ? start time (non-display) ? ? ?No
? ? ? ? ? ? ? M ? ? ? ? %MEM ? ? ? ? ? ? ? ? ? ? ? ? ?Yes
? ? ? ? ? ? ? N ? ? ? ? PID ? ? ? ? ? ? ? ? ? ? ? ? ? Yes
? ? ? ? ? ? ? P ? ? ? ? %CPU ? ? ? ? ? ? ? ? ? ? ? ? ?Yes
? ? ? ? ? ? ? T ? ? ? ? TIME+ ? ? ? ? ? ? ? ? ? ? ? ? Yes
按下f鍵(Fields)可以打開或者關閉指定的列,如下,
Fields Management for window 1:Def, whose current sort field is TIME+
? ?Navigate with Up/Dn, Right selects for move then <Enter> or Left commits,
? ?'d' or <Space> toggles display, 's' sets sort. ?Use 'q' or <Esc> to end!
* PID ? ? = Process Id ? ? ? ? ? ? ENVIRON = Environment vars ? ?
* USER ? ?= Effective User Name ? ?vMj ? ? = Major Faults delta ?
* PR ? ? ?= Priority ? ? ? ? ? ? ? vMn ? ? = Minor Faults delta ?
* NI ? ? ?= Nice Value ? ? ? ? ? ? USED ? ?= Res+Swap Size (KiB)?
* VIRT ? ?= Virtual Image (KiB) ? ?nsIPC ? = IPC namespace Inode?
* RES ? ? = Resident Size (KiB) ? ?nsMNT ? = MNT namespace Inode?
* SHR ? ? = Shared Memory (KiB) ? ?nsNET ? = NET namespace Inode?
* S ? ? ? = Process Status ? ? ? ? nsPID ? = PID namespace Inode?
* %CPU ? ?= CPU Usage ? ? ? ? ? ? ?nsUSER ?= USER namespace Inode
* %MEM ? ?= Memory Usage (RES) ? ? nsUTS ? = UTS namespace Inode?
* TIME+ ? = CPU Time, hundredths
* COMMAND = Command Name/Line ??
? PPID ? ?= Parent Process pid ?
? UID ? ? = Effective User Id ??
? RUID ? ?= Real User Id ? ? ? ?
? RUSER ? = Real User Name ? ? ?
? SUID ? ?= Saved User Id ? ? ??
? SUSER ? = Saved User Name ? ??
? GID ? ? = Group Id ? ? ? ? ? ?
? GROUP ? = Group Name ? ? ? ? ?
? PGRP ? ?= Process Group Id ? ?
? TTY ? ? = Controlling Tty ? ??
? TPGID ? = Tty Process Grp Id ?
? SID ? ? = Session Id ? ? ? ? ?
? nTH ? ? = Number of Threads ??
? P ? ? ? = Last Used Cpu (SMP)?
? TIME ? ?= CPU Time ? ? ? ? ? ?
? SWAP ? ?= Swapped Size (KiB) ?
? CODE ? ?= Code Size (KiB) ? ??
? DATA ? ?= Data+Stack (KiB) ? ?
? nMaj ? ?= Major Page Faults ??
? nMin ? ?= Minor Page Faults ??
? nDRT ? ?= Dirty Pages Count ??
? WCHAN ? = Sleeping in Function
? Flags ? = Task Flags <sched.h>
? CGROUPS = Control Groups ? ? ?
? SUPGIDS = Supp Groups IDs ? ??
? SUPGRPS = Supp Groups Names ??
? TGID ? ?= Thread Group Id ?
??
? 其中如下幾個filed 與內存有關。
? SWAP ? ?= Swapped Size (KiB) ?
? CODE ? ?= Code Size (KiB) ? ??
? DATA ? ?= Data+Stack (KiB) ? ?
? nMaj ? ?= Major Page Faults ??
? nMin ? ?= Minor Page Faults ??
? nDRT ? ?= Dirty Pages Count?
??
page fault 又分為幾種,major page fault、 minor page fault、 invalid(segment fault)。
major page fault也稱為hard page fault, 指需要訪問的內存不在虛擬地址空間,也不在物理內存中,需要從慢速設備載入。從swap回到物理內存也是hard page fault。
minor page fault也稱為soft page fault, 指需要訪問的內存不在虛擬地址空間,但是在物理內存中,只需要MMU建立物理內存和虛擬地址空間的映射關系即可。?
(通常是多個進程訪問同一個共享內存中的數據,可能某些進程還沒有建立起映射關系,所以訪問時會出現soft page fault)
invalid fault也稱為segment fault, 指進程需要訪問的內存地址不在它的虛擬地址空間范圍內,屬于越界訪問,內核會報segment fault錯誤。
3.vmstat
vmstat - Report virtual memory statistics
root@ubuntu:/home/ricky# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
?r ?b ? swpd ? free ? buff ?cache ? si ? so ? ?bi ? ?bo ? in ? cs us sy id wa st
?0 ?0 ? ? ?0 980532 134948 520236 ? ?0 ? ?0 ? ?34 ? ?10 ? 41 ? 70 ?1 ?1 98 ?0 ?0
?
? ? Memory
? ? ? ?swpd: the amount of virtual memory used.
? ? ? ?free: the amount of idle memory.
? ? ? ?buff: the amount of memory used as buffers.
? ? ? ?cache: the amount of memory used as cache.
? ? ? ?inact: the amount of inactive memory. ?(-a option)
? ? ? ?active: the amount of active memory. ?(-a option)
? ?Swap
? ? ? ?si: Amount of memory swapped in from disk (/s).
? ? ? ?so: Amount of memory swapped to disk (/s).
?
?4. slabtop
?slabtop - display kernel slab cache information in real time
?/proc/slabinfo
?
?Active / Total Objects (% used) ? ?: 350745 / 352998 (99.4%)
?Active / Total Slabs (% used) ? ? ?: 7986 / 7986 (100.0%)
?Active / Total Caches (% used) ? ? : 67 / 96 (69.8%)
?Active / Total Size (% used) ? ? ? : 59301.82K / 59760.34K (99.2%)
?Minimum / Average / Maximum Object : 0.01K / 0.17K / 8.00K
? OBJS ACTIVE ?USE OBJ SIZE ?SLABS OBJ/SLAB CACHE SIZE NAME
?70944 ?70944 100% ? ?0.12K ? 2217 ? ? ? 32 ? ? ?8868K dentry
?62342 ?62342 100% ? ?0.05K ? ?854 ? ? ? 73 ? ? ?3416K buffer_head
?40742 ?40742 100% ? ?0.61K ? 1567 ? ? ? 26 ? ? 25072K ext4_inode_cache
?34752 ?34483 ?99% ? ?0.06K ? ?543 ? ? ? 64 ? ? ?2172K kmalloc-64
?21252 ?21156 ?99% ? ?0.09K ? ?506 ? ? ? 42 ? ? ?2024K kmalloc-96
?19840 ?18831 ?94% ? ?0.03K ? ?155 ? ? ?128 ? ? ? 620K kmalloc-32
?19456 ?19456 100% ? ?0.03K ? ?152 ? ? ?128 ? ? ? 608K ext4_extent_status
?13568 ?13568 100% ? ?0.02K ? ? 53 ? ? ?256 ? ? ? 212K kmalloc-16
?10212 ?10212 100% ? ?0.34K ? ?444 ? ? ? 23 ? ? ?3552K inode_cache
? 8704 ? 8704 100% ? ?0.03K ? ? 68 ? ? ?128 ? ? ? 272K anon_vma
? 7875 ? 7745 ?98% ? ?0.19K ? ?375 ? ? ? 21 ? ? ?1500K kmalloc-192
? 7168 ? 7168 100% ? ?0.01K ? ? 14 ? ? ?512 ? ? ? ?56K kmalloc-8
? 6205 ? 6205 100% ? ?0.05K ? ? 73 ? ? ? 85 ? ? ? 292K Acpi-State
? 5772 ? 5772 100% ? ?0.30K ? ?222 ? ? ? 26 ? ? ?1776K radix_tree_node
? 4420 ? 4420 100% ? ?0.02K ? ? 26 ? ? ?170 ? ? ? 104K nsproxy
? 3654 ? 3598 ?98% ? ?0.37K ? ?174 ? ? ? 21 ? ? ?1392K proc_inode_cache
?
?5. pmap
? pmap - report memory map of a process
? root@ubuntu:/home/ricky/code# pmap 5162
5162: ? ./a.out
08048000 ? ? ?4K r-x-- a.out
08049000 ? ? ?4K r---- a.out
0804a000 ? ? ?4K rw--- a.out
b756a000 ? ?408K rw--- ? [ anon ]
b75d0000 ? 1700K r-x-- libc-2.19.so
b7779000 ? ? ?8K r---- libc-2.19.so
b777b000 ? ? ?4K rw--- libc-2.19.so
b777c000 ? ? 12K rw--- ? [ anon ]
b7794000 ? ? ?8K rw--- ? [ anon ]
b7796000 ? ? ?4K r-x-- ? [ anon ]
b7797000 ? ?128K r-x-- ld-2.19.so
b77b7000 ? ? ?4K r---- ld-2.19.so
b77b8000 ? ? ?4K rw--- ld-2.19.so
bfdaf000 ? ?132K rw--- ? [ stack ]
?total ? ? 2424K
?6.dmesg
? dmesg - print or control the kernel ring buffer
? 顯示內核啟動的日志 - 內存相關log:
?1 [ ? ?0.000000] PERCPU: Embedded 14 pages/cpu @f7b82000 s36096 r0 d21248 u57344
? ? ? 2 [ ? ?0.000000] pcpu-alloc: s36096 r0 d21248 u57344 alloc=14*4096
? ? ? 3 [ ? ?0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3 [0] 4 [0] 5 [0] 6 [0] 7
? ? ? 4 [ ? ?0.000000] Built 1 zonelists in Zone order, mobility grouping on. ?Total pages: 522373
? ? ? 5 [ ? ?0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-3.13.0-32-generic root=UUID=80483beb-4610-4202-8e4f-6e3774c72ce6 ? ? ? ? ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet
? ? ? 6 [ ? ?0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)
? ? ? 7 [ ? ?0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
? ? ? 8 [ ? ?0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
? ? ? 9 [ ? ?0.000000] Initializing CPU#0
? ? ?10 [ ? ?0.000000] xsave: enabled xstate_bv 0x3, cntxt size 0x240
? ? ?11 [ ? ?0.000000] allocated 4194296 bytes of page_cgroup
? ? ?12 [ ? ?0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups
? ? ?13 [ ? ?0.000000] Initializing HighMem for node 0 (00037bfe:00080000)
? ? ?14 [ ? ?0.000000] Memory: 2044664K/2096628K available (6528K kernel code, 639K rwdata, 2760K rodata, 872K init, 924K bss, 51964K ? ? ? ? reserved, 1183624K highmem)
? ? ?15 [ ? ?0.000000] virtual kernel memory layout:
? ? ?16 [ ? ?0.000000] ? ? fixmap ?: 0xfff14000 - 0xfffff000 ? ( 940 kB)
? ? ?17 [ ? ?0.000000] ? ? pkmap ? : 0xffc00000 - 0xffe00000 ? (2048 kB)
? ? ?18 [ ? ?0.000000] ? ? vmalloc : 0xf83fe000 - 0xffbfe000 ? ( 120 MB)
? ? ?19 [ ? ?0.000000] ? ? lowmem ?: 0xc0000000 - 0xf7bfe000 ? ( 891 MB)
? ? ?20 [ ? ?0.000000] ? ? ? .init : 0xc19b4000 - 0xc1a8e000 ? ( 872 kB)
? ? ?21 [ ? ?0.000000] ? ? ? .data : 0xc1660532 - 0xc19b3e80 ? (3406 kB)
? ? ?22 [ ? ?0.000000] ? ? ? .text : 0xc1000000 - 0xc1660532 ? (6529 kB)
?7. cat /proc/meminfo
?root@ubuntu:/proc# cat meminfo
MemTotal: ? ? ? ?2063844 kB
MemFree: ? ? ? ? ?746660 kB
Buffers: ? ? ? ? ?138740 kB
Cached: ? ? ? ? ? 656536 kB
SwapCached: ? ? ? ? ? ?0 kB
Active: ? ? ? ? ? 763260 kB
Inactive: ? ? ? ? 446108 kB
Active(anon): ? ? 415072 kB
Inactive(anon): ? ?10880 kB
Active(file): ? ? 348188 kB
Inactive(file): ? 435228 kB
Unevictable: ? ? ? ? ?32 kB
Mlocked: ? ? ? ? ? ? ?32 kB
HighTotal: ? ? ? 1183624 kB
HighFree: ? ? ? ? 489896 kB
LowTotal: ? ? ? ? 880220 kB
LowFree: ? ? ? ? ?256764 kB
SwapTotal: ? ? ? 2094076 kB
SwapFree: ? ? ? ?2094076 kB
Dirty: ? ? ? ? ? ? ? ? 0 kB
Writeback: ? ? ? ? ? ? 0 kB
AnonPages: ? ? ? ?414204 kB
Mapped: ? ? ? ? ? 155944 kB
Shmem: ? ? ? ? ? ? 11864 kB
Slab: ? ? ? ? ? ? ?61084 kB
SReclaimable: ? ? ?45424 kB
SUnreclaim: ? ? ? ?15660 kB
KernelStack: ? ? ? ?3160 kB
PageTables: ? ? ? ? 7428 kB
NFS_Unstable: ? ? ? ? ?0 kB
Bounce: ? ? ? ? ? ? ? ?0 kB
WritebackTmp: ? ? ? ? ?0 kB
CommitLimit: ? ? 3125996 kB?
Committed_AS: ? ?2766012 kB
VmallocTotal: ? ? 122880 kB
VmallocUsed: ? ? ? 23744 kB
VmallocChunk: ? ? ?61636 kB
HardwareCorrupted: ? ? 0 kB
AnonHugePages: ? ?186368 kB
HugePages_Total: ? ? ? 0
HugePages_Free: ? ? ? ?0
HugePages_Rsvd: ? ? ? ?0
HugePages_Surp: ? ? ? ?0
Hugepagesize: ? ? ? 2048 kB
DirectMap4k: ? ? ? 28664 kB
DirectMap2M: ? ? ?884736 kB
CommitLimit:CommitLimit
可以參考:
http://www.firefoxbug.com/index.php/archives/2800/
?8. /proc/sys/vm 目錄下的文件
?root@ubuntu:/proc/sys/vm# ll
total 0
dr-xr-xr-x 1 root root 0 Jun 10 05:31 ./
dr-xr-xr-x 1 root root 0 Jun 10 05:31 ../
-rw-r--r-- 1 root root 0 Jun 10 09:18 admin_reserve_kbytes
-rw-r--r-- 1 root root 0 Jun 10 09:18 block_dump
--w------- 1 root root 0 Jun 10 09:18 compact_memory
-rw-r--r-- 1 root root 0 Jun 10 09:18 dirty_background_bytes
-rw-r--r-- 1 root root 0 Jun 10 05:32 dirty_background_ratio
-rw-r--r-- 1 root root 0 Jun 10 09:18 dirty_bytes
-rw-r--r-- 1 root root 0 Jun 10 09:18 dirty_expire_centisecs
-rw-r--r-- 1 root root 0 Jun 10 05:32 dirty_ratio
-rw-r--r-- 1 root root 0 Jun 10 05:32 dirty_writeback_centisecs
-rw-r--r-- 1 root root 0 Jun 10 09:18 drop_caches
-rw-r--r-- 1 root root 0 Jun 10 09:18 extfrag_threshold
-rw-r--r-- 1 root root 0 Jun 10 09:18 highmem_is_dirtyable
-rw-r--r-- 1 root root 0 Jun 10 09:18 hugepages_treat_as_movable
-rw-r--r-- 1 root root 0 Jun 10 09:18 hugetlb_shm_group
-rw-r--r-- 1 root root 0 Jun 10 05:32 laptop_mode
-rw-r--r-- 1 root root 0 Jun 10 09:18 legacy_va_layout
-rw-r--r-- 1 root root 0 Jun 10 09:18 lowmem_reserve_ratio
-rw-r--r-- 1 root root 0 Jun 10 09:18 max_map_count
-rw-r--r-- 1 root root 0 Jun 10 09:18 memory_failure_early_kill
-rw-r--r-- 1 root root 0 Jun 10 09:18 memory_failure_recovery
-rw-r--r-- 1 root root 0 Jun 10 09:18 min_free_kbytes
-rw-r--r-- 1 root root 0 Jun 10 05:31 mmap_min_addr
-rw-r--r-- 1 root root 0 Jun 10 09:18 nr_hugepages
-rw-r--r-- 1 root root 0 Jun 10 09:18 nr_overcommit_hugepages
-r--r--r-- 1 root root 0 Jun 10 09:18 nr_pdflush_threads
-rw-r--r-- 1 root root 0 Jun 10 09:18 oom_dump_tasks
-rw-r--r-- 1 root root 0 Jun 10 09:18 oom_kill_allocating_task
-rw-r--r-- 1 root root 0 Jun 10 05:31 overcommit_memory
-rw-r--r-- 1 root root 0 Jun 10 09:18 overcommit_ratio
-rw-r--r-- 1 root root 0 Jun 10 09:18 page-cluster
-rw-r--r-- 1 root root 0 Jun 10 09:18 panic_on_oom
-rw-r--r-- 1 root root 0 Jun 10 09:18 percpu_pagelist_fraction
-rw-r--r-- 1 root root 0 Jun 10 09:18 scan_unevictable_pages
-rw-r--r-- 1 root root 0 Jun 10 09:18 stat_interval
-rw-r--r-- 1 root root 0 Jun 10 09:18 swappiness
-rw-r--r-- 1 root root 0 Jun 10 09:18 user_reserve_kbytes
-rw-r--r-- 1 root root 0 Jun 10 09:18 vdso_enabled
-rw-r--r-- 1 root root 0 Jun 10 09:18 vfs_cache_pressure
解釋:
swappiness:
(0~100), 該值越高則linux越傾向于將部分長期沒有用到的頁swap到交換磁盤。
swappiness=0,不會交換匿名頁面到交換磁盤,除非系統內存非常低
swappiness=100, 內核積極回收匿名頁面。
panic_on_oom:
用于控制如何處理out-of-memory,可選值包括0/1/2
0:當內存不足時內核調用OOM killer殺死一些rogue進程,每個進程描述符都有一個oom_score標示,oom killer會選擇oom_score較大的進程
1:發生了OOM以后,如果有mempolicy/cpusets的進程限制,而這些nodes導致了內存問題的時候,OOM Killer會干掉這些中的一個,系統也會恢復
2:OOM后必然panic
備注:每個進程有一個oom_score_adj (取值范圍:-1000 - 1000)與此參數有關,-1000表示不會被oom killer選中。
舊版本中用的是oom_adj(-17,15),不過oom_adj逐漸會被oom_score_adj 取代。
比如:
cat /proc/<pid>/oom_score_adj
如下鏈接非常重要:
https://www.cnblogs.com/tolimit/p/5065761.html
admin_reserve_kbytes:給有cap_sys_admin權限的用戶保留的內存數量(默認值是 min(free_page * 0.03, 8MB))
drop_caches:
寫入數值可以使內核釋放page_cache,dentries和inodes緩存所占的內存。
1:只釋放page_cache
2:只釋放dentries和inodes緩存
3:釋放page_cache、dentries和inodes緩存
oom_dump_tasks
如果啟用,在內核執行OOM-killing時會打印系統內進程的信息(不包括內核線程),信息包括pid、uid、tgid、vm size、rss、nr_ptes,swapents,oom_score_adj和進程名稱。這些信息可以幫助找出為什么OOM killer被執行,找到導致OOM的進程,以及了解為什么進程會被選中。
0:不打印系統內進程信息
1:打印系統內進程信息
memory_failure_early_kill:
控制發生某個內核無法處理的內存錯誤發生的時候,如何去殺掉這個進程。當這些錯誤頁有swap鏡像的時候,內核會很好的處理這個錯誤,不會影響任何應用程序,但是如果沒有的話,內核會把進程殺掉,避免內存錯誤的擴大
1:在發現內存錯誤的時候,就會把所有擁有此內存頁的進程都殺掉
0:只是對這部分頁進行unmap,然后把第一個試圖進入這個頁的進程殺掉
memory_failure_recovery:
是否開啟內存錯誤恢復機制
1:開啟
0:一旦出現內存錯誤,就panic
https://blog.csdn.net/joyeu/article/details/20063429
min_free_kbytes:代表系統所保留空閑內存的最低限,在系統初始化時會根據內存大小計算一個默認值,計算規則是:
min_free_kbytes = sqrt(lowmem_kbytes * 16) = 4 * sqrt(lowmem_kbytes)(注:lowmem_kbytes即可認為是系統內存大小)
min_free_kbytes的主要用途是計算影響內存回收的三個參數 watermark[min/low/high]
?三個watermark的計算方法:
?watermark[min] = min_free_kbytes換算為page單位即可,假設為min_free_pages。
?因為是每個zone各有一套watermark參數,實際計算效果是根據各個zone大小所占內存總大小的比例,而算出來的per zone min_free_pages)
?watermark[low] = watermark[min] * 5 / 4
?watermark[high] = watermark[min] * 3 / 2
https://blog.csdn.net/joyeu/article/details/20063429
lowmem_reserve_ratio
1.作用
除了min_free_kbytes會在每個zone上預留一部分內存外,lowmem_reserve_ratio是在各個zone之間進行一定的防衛預留,主要是防止高端zone在沒內存的情況下過度使用低端zone的內存資源。
例如現在常見的一個node的機器有三個zone: DMA,DMA32和NORMAL。DMA和DMA32屬于低端zone,內存也較小,如96G內存的機器兩個zone總和才1G左右,NORMAL就相對屬于高端內存(現在一般沒有HIGH zone),而且數量較大(>90G)。低端內存有一定的特殊作用比如發生DMA時只能分配DMA zone的低端內存,因此需要在 盡量可以使用高端內存時 而 不使用低端內存,同時防止高端內存分配不足的時候搶占稀有的低端內存
?
http://www.firefoxbug.com/index.php/archives/2800/
overcommit_memory:
0 — 默認設置。個人理解:當應用進程嘗試申請內存時,內核會做一個檢測。內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,并把錯誤返回給應用進程。舉個例子,比如1G的機器,A進程已經使用了500M,當有另外進程嘗試malloc 500M的內存時,內核就會進行check,發現超出剩余可用內存,就會提示失敗。
1 — 對于內存的申請請求,內核不會做任何check,直到物理內存用完,觸發OOM殺用戶態進程。同樣是上面的例子,1G的機器,A進程500M,B進程嘗試malloc 500M,會成功,但是一旦kernel發現內存使用率接近1個G(內核有策略),就觸發OOM,殺掉一些用戶態的進程(有策略的殺)。
2 — 當請求申請的內存 >= SWAP內存大小 + 物理內存 * ?N,則拒絕此次內存申請。
解釋下這個N:N是一個百分比,根據overcommit_ratio/100來確定,比如overcommit_ratio=50,那么N就是50%。
overcommit_ratio:
只有當vm.overcommit_memory = 2的時候才會生效,內存可申請內存為
SWAP內存大小 + 物理內存 * overcommit_ratio/100
percpu_pagelist_fraction:
每個CPU能從每個zone所能分配到的pages的最大值(單位每個zone的1/X),0為不限制
9. sync
NAME
? ? ? ?sync - flush file system buffers
DESCRIPTION
? ? ? ?Force changed blocks to disk, update the super block.
??
11./proc/pagetypeinfo
root@ubuntu:/usr/local# cat /proc/pagetypeinfo
Page block order: 9
Pages per block: ?512
Free pages count per migrate type at order ? ? ? 0 ? ? ?1 ? ? ?2 ? ? ?3 ? ? ?4 ? ? ?5 ? ? ?6 ? ? ?7 ? ? ?8 ? ? ?9 ? ? 10?
Node ? ?0, zone ? ? ?DMA, type ? ?Unmovable ? ? ?1 ? ? ?1 ? ? ?3 ? ? ?0 ? ? ?0 ? ? ?1 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ? ? ?DMA, type ?Reclaimable ? ? ?1 ? ? ?1 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?1 ? ? ?1 ? ? ?0 ? ? ?1 ? ? ?1 ? ? ?0?
Node ? ?0, zone ? ? ?DMA, type ? ? ?Movable ? ? ?2 ? ? ?1 ? ? ?1 ? ? ?0 ? ? ?0 ? ? ?1 ? ? ?0 ? ? ?1 ? ? ?1 ? ? ?0 ? ? ?0?
Node ? ?0, zone ? ? ?DMA, type ? ? ?Reserve ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?1 ? ? ?0?
Node ? ?0, zone ? ? ?DMA, type ? ? ? ? ?CMA ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ? ? ?DMA, type ? ? ?Isolate ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ? Normal, type ? ?Unmovable ? ? ?7 ? ? ?1 ? ? ?0 ? ? ?0 ? ? ?3 ? ? ?7 ? ? 12 ? ? ?9 ? ? ?3 ? ? ?0 ? ? ?0?
Node ? ?0, zone ? Normal, type ?Reclaimable ? ? ?1 ? ? ?1 ? ? ?3 ? ? ?2 ? ? ?2 ? ? ?0 ? ? ?1 ? ? ?0 ? ? ?0 ? ? ?1 ? ? ?0?
Node ? ?0, zone ? Normal, type ? ? ?Movable ? ?136 ? ? 90 ? ? 63 ? ? 13 ? ? ?1 ? ? ?0 ? ? ?7 ? ? ?3 ? ? ?2 ? ? ?0 ? ? 78?
Node ? ?0, zone ? Normal, type ? ? ?Reserve ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?1?
Node ? ?0, zone ? Normal, type ? ? ? ? ?CMA ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ? Normal, type ? ? ?Isolate ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ?HighMem, type ? ?Unmovable ? ? ?0 ? ? ?1 ? ? ?0 ? ? ?7 ? ? 21 ? ? 11 ? ? ?8 ? ? ?8 ? ? ?2 ? ? ?2 ? ? ?2?
Node ? ?0, zone ?HighMem, type ?Reclaimable ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ?HighMem, type ? ? ?Movable ? ? 27 ? ? 27 ? ? 42 ? ? 13 ? ? 24 ? ? ?8 ? ? ?5 ? ? ?2 ? ? ?3 ? ? ?5 ? ?148?
Node ? ?0, zone ?HighMem, type ? ? ?Reserve ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?1?
Node ? ?0, zone ?HighMem, type ? ? ? ? ?CMA ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Node ? ?0, zone ?HighMem, type ? ? ?Isolate ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0 ? ? ?0?
Number of blocks type ? ? Unmovable ?Reclaimable ? ? ?Movable ? ? ?Reserve ? ? ? ? ?CMA ? ? ?Isolate?
Node 0, zone ? ? ?DMA ? ? ? ? ? ?1 ? ? ? ? ? ?2 ? ? ? ? ? ?4 ? ? ? ? ? ?1 ? ? ? ? ? ?0 ? ? ? ? ? ?0?
Node 0, zone ? Normal ? ? ? ? ? 44 ? ? ? ? ? 24 ? ? ? ? ?368 ? ? ? ? ? ?2 ? ? ? ? ? ?0 ? ? ? ? ? ?0?
Node 0, zone ?HighMem ? ? ? ? ? 23 ? ? ? ? ? ?0 ? ? ? ? ?555 ? ? ? ? ? ?1 ? ? ? ? ? ?0 ? ? ? ? ? ?0?
12. oom killer
人為制造一個oom killer:
echo f > /proc/sysrq-trigger
另外,向sysrq寫入命令的幫助文件如下,上例中寫入的f: memory-full-oom-kill(f),也就是執行oom kill
SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) show-blocked-tasks(w) dump-ftrace-buffer(z)
總結
以上是生活随笔為你收集整理的Linux 的内存管理工具和调优参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux内存布局及页面映射
- 下一篇: 万能的天涯人 有知道这两款护发产品的吗?