Linux物理内存描述-LinuxKernelExploration
- 格式:pdf
- 大小:718.69 KB
- 文档页数:21
在Linux系统中,有一些常用的命令可以用来查看和管理内存。
以下是一些常见的Linux内存相关指令:
1. free:显示系统内存使用情况和交换空间使用情况。
示例:`free -h`
2. top:实时显示系统进程和内存使用情况。
示例:`top`
3. vmstat:显示系统虚拟内存统计信息,包括内存使用情况、I/O等。
示例:`vmstat`
4. ps:显示系统进程状态,包括进程的内存使用情况。
示例:`ps aux`
5. pmap:显示进程的内存映射情况。
示例:`pmap <pid>`
6. smem:综合显示系统内存使用情况,包括物理内存、共享内存、缓存等。
示例:`smem -r`
7. sar:系统活动报告,包括CPU、内存、磁盘等性能信息。
示例:`sar -r`
8. top命令中按下"Shift+m":按内存使用量排序显示进程列表。
示例:启动top命令后,按下Shift键再按m键。
这些命令可以帮助您了解系统当前的内存使用情况和进程的内存占用情况。
请注意,具体命令的参数和输出可能会因不同的Linux发行版和版本而有所不同。
您可以通过查阅相关文档或使用命令的帮助选项来获取更多详细信息。
Linux内核参数说明转载⾃:https:///tolimit/p/5065761.html 因个⼈能⼒有限,不能保证所有描述都正确,还请⼤家集思⼴益,有错误的地⽅欢迎⼤家留⾔指正,同时也欢迎⼤家留⾔对未标注项进⾏补偿,谢谢。
内核参数列表kernel.acct acct功能⽤于系统记录进程信息,正常结束的进程都会在该⽂件尾添加对应的信息。
异常结束是指重启或其它致命的系统问题,不能够记录永不停⽌的进程。
该设置需要配置三个值,分别是:1.如果⽂件系统可⽤空间低于这个百分⽐值,则停⽌记录进程信息。
2.如果⽂件系统可⽤空间⾼于这个百分⽐值,则开始记录进程信息。
3.检查上⾯两个值的频率(以秒为单位)。
kernel.auto_msgmni 系统⾃动设置同时运⾏的消息队列个数。
0:不⾃动1:⾃动kernel.blk_iopollkernel.cad_pid接收Ctrl-alt-del操作的INT信号的进程的PIDkernel.cap_last_cap系统capabilities最⾼⽀持的权限等级。
详见:/iamfy/archive/2012/09/20/2694977.html pat-logkernel.core_pattern设置core⽂件保存位置或⽂件名,只有⽂件名时,则保存在应⽤程序运⾏的⽬录下kernel.core_pipe_limit 定义了可以有多少个并发的崩溃程序可以通过管道模式传递给指定的core信息收集程序。
如果超过了指定数,则后续的程序将不会处理,只在内核⽇志中做记录。
0是个特殊的值,当设置为0时,不限制并⾏捕捉崩溃的进程,但不会等待⽤户程序搜集完毕⽅才回收/proc/pid⽬录(就是说,崩溃程序的相关信息可能随时被回收,搜集的信息可能不全)。
kernel.core_uses_pid Core⽂件的⽂件名是否添加应⽤程序pid做为扩展0:不添加1:添加kernel.ctrl-alt-del 该值控制系统在接收到 ctrl+alt+delete 按键组合时如何反应:1:不捕获ctrl-alt-del,将系统类似于直接关闭电源0:捕获ctrl-alt-del,并将此信号传⾄cad_pid保存的PID号进程进⾏处理kernel.dmesg_restrict 限制哪些⽤户可以查看syslog⽇志0:不限制1:只有特权⽤户能够查看kernel.domainname⽹络域名(重启失效)kernel.ftrace_dump_on_oops 确定是否将ftrace的缓冲区的信息打印出来,是通过printk来打印的0:不打印1:在系统oops时,⾃动dump堆栈信息到输出终端kernel.hostname主机名(重启失效)kernel.hotplug该⽂件给出了当前系统⽀持热插拔(hotplug)时接收热插拔事件的程序的名字(包括路径)。
《Linux性能及调优指南》Linux内存结构1.2.1 物理内存与虚拟内存1.2.2 虚拟内存管理执行一个进程时,需要Linux 内核分配一段内存区域,用来作为工作区来执行它的工作。
这就像你的办工桌,你可以用它来摆放工作需要的纸张、文件和备忘录。
不同之处是Linux内核要使用动态的方法来分配内存空间。
在内存大小通常是有限的情况下有时进程的数量会达到数万个,Linux内核必须有效地来使用内存。
在本章节中,我们会了解到内存的结构、地址分布,以及Linux是怎样有效地管理内存空间的。
1.2.1 物理内存与虚拟内存今天我要面对选择32位系统还是选择64位系统的这样问题。
其中对于企业级用户最重要的区别就是虚拟内存地址是否可以超过4GB。
从性能角度来看,弄明白32位和64位Linux内核是怎么样将物理内存映射到虚拟内存是非常有益的。
在图1-10中,你可以很明显的看出32位系统和64位系统在内存地址分配上的不同之处。
关于物理内存映射到虚拟内存的详细内容已超出本文的范畴,本文将只着重介绍Linux内存结构的部分细节。
在32位架构如IA-32中,Linux内核只能直接访问物理内存的前1GB(当考虑保留部分时只有896MB)。
在ZONE_NORMAL之上的内存需要映射到1GB一下,这样的映射对于应用来说是完全透明的,但分配内存页到ZONE_HIGHMEM会导致性能轻微的下降。
在64位架构如x86-64(也称作x64),ZONE_NORMAL可一直延伸到64GB,在IA-64中甚至达到128GB。
正如你所见到的,在64位架构中,可以被省去将内存页从ZONE_HIGHMEM映射到ZONE_NORMAL的开销。
图1-10 32位和64位Linux内核内存布局虚拟内存寻址布局图1-11展示了32位和64位Linux虚拟寻址布局。
在32位架构中,单个进程能访问最大地址空间位4GB,这就限制了32位虚拟寻址能力。
在标准实现中,虚拟地址空间被分为3GB的用户空间和1GB的内核空间,这有些像4 G/4 G寻址布局实现的变种。
Linxu内核参数详解1. #表⽰SYN队列的长度,默认为1024,加⼤队列长度,可以容纳更多等待连接的⽹络连接数。
2. net.ipv4.tcp_max_syn_backlog = 655363.4. #每个⽹络接⼝接收数据包的速率⽐内核处理这些包的速率快时,允许送到队列的数据包的最⼤数⽬5. dev_max_backlog = 327686.7. #默认128,这个参数会影响到所有AF_INET类型socket的listen队列8. net.core.somaxconn = 327689.10. #系统套接字写默认缓冲区11. net.core.wmem_default = 838860812.13. #系统套接字读默认缓冲区14. net.core.rmem_default = 838860815.16. #系统套接字读最⼤缓冲区17. net.core.rmem_max = 1677721618.19. #系统套接字写最⼤缓冲区20. net.core.wmem_max = 1677721621.22. #此参数与net.ipv4.tcp_wmem都是⽤来优化TCP接收/发送缓冲区,包含三个整数值,分别是:min,default,max:23. #tcp_rmem:min表⽰为TCP socket预留⽤于接收缓冲的最⼩内存数量,default为TCP socket预留⽤于接收缓冲的缺省内存数量,max⽤于TCP socket接收缓冲的内存最⼤值。
24. #tcp_wmem:min表⽰为TCP socket预留⽤于发送缓冲的内存最⼩值,default为TCP socket预留⽤于发送缓冲的缺省内存值,max⽤于TCP socket发送缓冲的内存最⼤值。
25. net.ipv4.tcp_rmem=4096 87380 419430426. net.ipv4.tcp_wmem=4096 16384 419430427.28. #时间戳可以避免序列号的卷绕。
linux内存相关指标
在Linux系统中,有几个重要的内存相关指标可用于监控和管理系统内存的使
用情况。
以下是一些常见的Linux内存指标:
1. Total(总内存):这是系统中总共可用的内存量,包括物理内存和交换空
间。
2. Used(已使用内存):已经被分配给进程使用的内存量,包括正在使用的物
理内存和交换空间。
3. Free(空闲内存):尚未被分配给任何进程使用的内存量,包括未使用的物
理内存和未使用的交换空间。
4. Buffers(缓冲区):用于存储正在写入磁盘的数据的缓冲区所使用的内存
量。
5. Cached(缓存):用于存储经常访问的文件数据的缓存所使用的内存量。
6. Swap(交换空间):当内存不足时,用于将不活动的内存页交换到磁盘上的
一块特殊的空间。
Swap被视为延伸的物理内存。
这些指标可以通过命令`free`来查看,例如:
```
$ free -h
total used free shared buff/cache available
Mem: 7.7G 3.5G 1.2G 239M 3.0G 3.0G
Swap: 2.0G 392M 1.6G
```
除了`free`命令之外,还可以使用`top`、`htop`、`procfs`等工具来查看和监
控系统内存使用情况。
这些内存指标对于诊断性能问题、优化内存使用以及了解系统健康状况都非常
有用。
在运行Linux服务器或进行性能调优时,了解和监控内存指标可以帮助您更
好地管理系统资源。
Linux物理内存描述 目 录1概述 (3)2物理内存相关概念 (3)2.1NUMA(Non Uniform Memory Access) (3)2.2页面和虚拟内存(Paging and Virtual Memory) (5)2.2.1PAE(Physical Address Extensions) (6)2.2.2PSE(Page Size Extensions) (6)2.3TLB(Translation Lookaside Buffers) (7)3Linux内核对物理内存描述 (7)3.1节点(Node) (8)3.2区域(Zone) (10)3.2.1区域类型 (10)3.2.2struct zone结构体 (13)3.3页面(Page) (15)3.3.1struct page结构体 (15)3.3.2页面标志 (17)4Linux物理内存描述信息查看 (19)4.1/proc/zoneinfo (19)4.2/proc/pagetypeinfo (19)4.3/sys/devices/system/node/node*/meminfo (19)4.4echo m > /proc/sysrq-trigger (20)1 概述Linux内核采用页式存储管理,进程的地址空间被划分成固定大小的“页面”;物理内存同样被分为与页面大小相同的“页帧”,由MMU在运行时将虚拟地址“映射”成某个物理内存页面上的地址。
本文以linux-2.6.32-220.el6版本内核源码为基础,介绍Linux内核中有关物理内存的概念,和如何描述物理内存。
注意:本文中涉及到的仅是和物理内存有关的概念、数据结构。
和地址如何映射、线性地址、物理地址;内存如何分配/回收等概念无关。
2 物理内存相关概念2.1 NUMA(Non Uniform Memory Access)在现代计算机中,CPU访问内存的速度与两者之间的距离有关,导致访问不同内存区域的时间可能不同。
如下图,是系统中有2个CPU(可以超过2个CPU)时,NUMA内存访问模型。
图1NUMA内存访问模型图2是Intel Nehalem(Xeon E5xxx系列)架构中NUMA内存访问模型。
每个CPU下面都有物理内存,两个CPU之间通过QPI总线通信。
黑色箭头表示访问本地CPU下面的物理内存,绿色箭头为访问另外CPU下的物理内存。
本地CPU访问其他CPU下面内存时,数据要通过QPI总线传输。
显然访问本地内存速度最快,访问其他CPU下面的内存速度较慢。
这就是NUMA的由来Nehalem EPNehalemEPTylersburgEP图2 Intel Nehalem 架构中NUMA 内存访问模型下面两个图分别是Nehalem 架构下,本地内存访问和远端内存访问模型。
图3 Intel Nehalem 架构中本地内存访问图4 Intel Nehalem 架构中远端内存访问2.2 页面和虚拟内存(Paging and Virtual Memory)当打开Intel CPU页面机制时,线性地址空间就划分成页面,虚拟地址的页面然后映射到物理页面。
当Linux使用页面机制时,对上层应用程序是透明的。
即Intel CPU就是这么实现的,采用段页式机制,所有运行在Intel CPU上的OS都要遵守页面机制,包括Windows、Linux都是如此。
下图是x86/x86_64架构中,页面大小为4K时,页面属性。
图5x86中物理页面属性(Page Table Entry)下面表为页面属性(Page Table Entry)各字段含义。
这些字段包括线性地址对应的物理页面是否存在、页面是否可读写、是用户模式还是系统模式、页面是否为脏等。
这些属性在Linux内核实现中都会用到。
表1 页面属性(Page Table Entry)各字段含义为了便于理解页面属性的作用,我们来看一个示例。
如系统有两个进程i 和j ,内核可以设置该进程使用的物理页面属性,如进程对某些页面只能读,而不能写;对某些页面可读可写。
这样既可以图6 页面属性示例2.2.1 PAE (Physical Address Extensions )在x86 CPU 中,只有32位地址总线,也就意味着只有4G 地址空间。
为了实现在32位系统中使用更多的物理内存,Intel CPU 提供了PAE (Physical Address Extensions )机制,这样可以使用超过4G 物理内存。
PAE 机制的打开,需要设置CR0、CR4控制寄存器和IA32_EFER MSR 寄存器。
设置值为CR0.PG = 1,CR4.PAE = 1和IA32_EFER.LME = 0。
但PAE 机制打开后,MMU 会将32位线性地址转换为52位物理地址。
尽管物理地址是52位(4PB ),但线性地址仍然为32位,即进程可使用的物理内存不超过4GB 。
2.2.2 PSE (Page Size Extensions )前面提到x86/x86_64 CPU 中提供的是段页式机制,也介绍了页面。
页面大小虽然是固定的,但x86/x86_64 CPU 支持两种页面大小4KB 和4MB 。
大多数情况下OS 内核使用的是4KB 页面,但系统中多数进程使用内存较大时,如每次申请至少4MB ,则使用4MB 页面较为合适。
当控制寄存器CR4.PSE = 1时,页面大小是4MB 。
Page TablesProcess i:Process j:2.3 TLB(Translation Lookaside Buffers)在《Linux内存地址映射》中,详细介绍了CPU如何将逻辑地址转换为物理地址,这个过程需要多次访问物理内存,从内存中读取页面目录表、页面表。
若有4级映射,从内存读取地址映射表的次数更多。
这个过程相对CPU运算能力而言,是非常耗时的。
CPU可以将线性地址映射信息保存在TLB中,即TLB保存着线性地址与物理页面的对应关系,这样CPU下次访问该线性地址时,直接可以从TLB中找到对应的物理页面,不再需要线性地址到物理地址的繁琐映射过程,大大加快找到物理页面的速度。
我们对CPU的Cache非常熟悉,一般用缓存内存数据的指令。
TLB也是一种Cache,也是在集成在CPU内部,只是它保存地址映射关系,不是数据或指令。
线性地址映射时,每次都首先会从TLB中查找,若命中,则直接读出物理页面地址;若未命中,再进行页式地址映射。
图7Translation Lookaside Buffer和Cache3 Linux内核对物理内存描述Linux将物理内存按固定大小的页面(一般为4K)划分内存,在内核初始化时,会建立一个全局struct page结构数组mem_map[ ]。
如系统中有76G物理内存,则物理内存页面数为76*1024*1024k/4K= 19922944个页面,mem_map[ ]数组大小19922944,即为数组中每个元素和物理内存页面一一对应,整个数组就代表着系统中的全部物理页面。
在服务器中,存在NUMA架构(如Nehalem、Romly等),Linux将NUMA中内存访问速度一致(如按照内存通道划分)的部分称为一个节点(Node),用struct pglist_data数据结构表示,通常使用时用它的typedef定义pg_data_t。
系统中的每个结点都通过pgdat_list 链表pg_data_t->node_next连接起来,该链接以NULL为结束标志。
每个结点又进一步分为许多块,称为区域(zones)。
区域表示内存中的一块范围。
区域用struct zone_struct数据结构表示,它的typedef定义为zone_t。
每个区域(Zone)中有多个页面(Pages)组成。
节点、区域、页面三者关系如下图。
图8 节点、区域及页面关系图3.1 节点(Node)节点(Node),在linux中用struct pglist_data数据结构表示,通常使用时用它的typedef 定义pg_data_t,数据结构定义在文件include/linux/mmzone.h中。
00630: /*00631: * The pg_data_t structure is used in machines withCONFIG_DISCONTIGMEM00632: * (mostly NUMA machines?) to denote a higher-level memory zone than the00633: * zone denotes.00634:00635: * On NUMA machines, each NUMA node would have a pg_data_t to describe00636: * it's memory layout.00637: *00638: * Memory statistics and page replacement data structures are maintained on a00639: * per-zone basis.00640: */00641: struct bootmem_data;00642: typedef struct p g l i s t_d a t a{00643: struct zone node_zones[MAX_NR_ZONES];00644: struct zonelist node_zonelists[MAX_ZONELISTS];00645: int nr_zones;00646: #ifdef CONFIG_FLAT_NODE_MEM_MAP /* means ! SPARSEMEM */00647: struct page *node_mem_map;00648: #ifdef CONFIG_CGROUP_MEM_RES_CTLR00649: struct page_cgroup *node_page_cgroup;00650: #endif00651: #endif00652: struct bootmem_data *bdata;00653: #ifdef CONFIG_MEMORY_HOTPLUG00654: /*00655: * Must be held any time you expect node_start_pfn,node_present_pages00656: * or node_spanned_pages stay constant. Holding this will also 00657: * guarantee that any pfn_valid() stays that way.00658: *00659: * Nests above zone->lock and zone->size_seqlock.00660: */00661: spinlock_t node_size_lock;00662: #endif00663: unsigned long node_start_pfn;00664: unsigned long node_present_pages; /* total number of physical pages */00665: unsigned long node_spanned_pages; /* total size of physical page 00666: range, including holes */00667: int node_id;00668: wait_queue_head_t kswapd_wait;00669: struct task_struct *kswapd;00670: int kswapd_max_order;00671: } ? end pglist_data ? p g_d a t a_t;00672:其中的成员变量含义如下:node_zones:这个结点的区域有,在x86中有,ZONE_HIGHMEM,ZONE_NORMAL,ZONE_DMA;x86_64 CPU中区域有DMA、DMA32和NORMAL三部分。