记忆是计算机最重要的部分之一。这是一个沟通的桥梁与CPU,内存中的计算机上运行的所有程序,因此内存的性能对计算机的影响很大。记忆功能是用来暂时存储操作数据在CPU与外部存储器如硬盘交换的数据。只要电脑在运行中,CPU需要内存操作完成数据传输。当操作完成后,CPU将再次传送结果,内存的操作也将决定计算机的稳定运行,内存可能是整个操作系统最麻烦的设备,其性能直接受到整个操作系统的影响。


我们知道,CPU不处理硬盘,只有数据加载到内存被CPU访问存储器时,CPU需要监测的要求,如记忆、控制和分配内存的读写请求的监控程序,叫做MMU(内存管理单元)的32。位系统来说明内存访问过程:


在每32位系统中,每个进程访问内存,每个进程都有自己的4字节内存空间。它被称为虚拟内存,虚拟内存(地址),通过MMU转换到物理内存。为了能够将线性地址转换成物理地址,页表的内存空间(页表)是必需的,以及页表加载到内存中以便完成。从线性地址到物理地址的映射,如果图1到1字节的字节,我们需要一个非常大的表,这将是非常复杂的。因此,存储空间分为另一种形式的存储单元,通常4K。在不同的硬件平台上,它们的大小一般是不同的,像x86 32位页4K,而64位有4K页面,200万页,4m页,8m页等等,所有这些都是4K的默认。一般来说,每个过程中都有自己的网页路径和页表映射机制,是否页表是由内核加载。每次只能看到自己的线性地址空间,要添加新的记忆,只能适用于他们的线性地址空间,并且应用程序必须通过操作系统内核映射到物理地址空间中找到这样一个空间,让线性地址空间可以访问,准备。在页面表中添加一个映射,这样就可以访问物理内存,这称为内存分配。但是新的应用程序必须通过操作内核到物理内存空间,并告知线性地址空间足够好来构建映射关系。最后,页面表建立映射关系。


这反映了上述描述的一般情况,您可以看到每个用户程序都有自己的页表和对应主存的映射。


根据以上文字和图表的描述,可以找到2个问题:


1。如果需要访问内存,每个进程都需要查找页表,这将导致服务器的性能。


2。如果主存的内存是满的,那么应用程序在内存需要调用时做什么呢


对于第一个问题,我们需要与TLB的帮助将备份缓冲区(Lookaside Buffer)。TLB是一个内存管理单元,可以用来提高虚拟地址到物理地址的转换的高速缓存,所以每次你查找页表,你可以去TLB找到相应的页表数据。如果你有,你可以回去,不要找页表缓存TLB再次找到你的结果。虽然解决了TLB缓存功能,它仍然是缓慢的在页表中找到映射关系,所以有一个页表,页表目录的层次,可以分为1级目录,2级目录和偏移


但是过程中需要频繁打开文件和关闭文件运行时,这意味着需要频繁申请内存和释放内存。有些进程在内存中缓存数据,分配更多的内存,所以每个任务将在页表中创建一个相应的项目。所以,即使如果记忆是快速的,同时大量的频繁分配和释放内存仍然会降低服务器的整体性能。当然,当内存空间不够,我们称之为OOM(出内存,内存耗尽)。当内存耗尽,整个操作系统挂起。在这种情况下,我们可以考虑交换分区。毕竟,swap分区,虚拟内存的硬盘产生的,所以其性能比真正的记忆差多了,所以我们应该尽量避免交换分区。当你的物理内存空间,尽量保证所有的物理内存used.cpu,在任何情况下,不能处理内存交换。它只能处理物理内存和空间可以解决只能是物理内存,所以当真正的物理内存空间不够,它会使用LRU算法存储在内存交换最近使用的内存,所以在物理内存中的空间可用于新的项目。但是这将导致另一个问题,那就是,当最初的过程是在页表中的数据,空间也没有。所以此刻CPU发送告诉地址空间不属于它的程序通知或异常,并有可能在这个时候2种情况:


1。可用的物理内存空间:这一次的CPU按照以前的转换策略将分区中的内存转换为物理内存,但前面的地址空间不一定是空间段地址,因为以前的空间可能已经被其他人使用了。这个.


2。没有可用的物理内存可用空间:这段时间仍然会使用LRU算子在内存中转换交换使用最近最少当前物理地址空间的地址,并在存储器中的交换空间的故障电流过程中的物理内存空间,并重新映射。


上述通知或异常的发生通常被称为一个页面的不足。页面不足的异常也分为两种:大的和小的异常异常。唯一的例外是在访问数据,不,不,不装上硬盘,无论从内存交换或直接从磁盘文件系统,它需要加载硬盘反正。这种异常加载需要很长时间,很少有例外是通过进程共享内存的过程。当第二个进程正在访问时,没有本地内存映射表。但是,其他进程已经有内存页,因此可以直接映射。这种异常的加载时间通常很短。


启动操作系统时,每个IO设备申请了多项随机端口和CPU一样,称为IO端口。在IBM PC体系结构,共有65536个8位的我/ O端口在我/ O地址空间提供。正是这些IO口的存在,CPU可以读取和写入IO设备进行交互。当执行读写操作,CPU将地址总线选择要求我/ O端口,使用数据总线CPU登记和端口之间的数据传输。我/ O端口也可以被映射到物理地址空间:因此,处理器和I/O设备之间的通信就可以直接使用汇编语言指令的内存操作(例如,MOV,和,或等现代硬件)。e设备更倾向于映射I/O,因为这个过程更快,可以与DMA结合使用,这样,当IO将数据传送到内存时,就不需要通过CPU和CPU将总线的控制权传输给DMA。一旦IO数据传输,它调用DMA一次,然后释放CPU。当数据完成后,DMA通知CPU中断它once.dma已经在整个总线控制运行时,当CPU发现其他进程需要使用总线,两者会产生冲突。在这个时候,CPU和DMA对总线控制使用的平等权利,只要CPU是委托给DMA,你不能收回的委托时,等待DMA的使用。


如果没有其他进程可以运行,或其他过程会很短,CPU会发现我们的IO仍然不是当时完成的,这意味着CPU只能等待IO.CPU在时间分配iowait值,即CPU等待IO花费时间。有些是在同步调用的过程。CPU必须等待IO的完成。没有CPU可以释放IO传输自动,和CPU可以做其他的事情了。在硬盘数据传输完毕后,硬盘只需要启动一个通知CPU,在CPU的外围设备,这是一个可编程中断控制器为每个硬件设备与CPU,BIOS时被检测到,该装置将登记所谓的中断号上的可编程中断控制器,所以这个数字是用在这个硬件。目前,可能会有多个硬件的主机上,每个硬件都有自己的编号。在接收中断号后,CPU可以通过中断相位表查找硬件设备中断,并由相应的IO口处理。


CPU运行的其他进程,当一个中断请求过来,CPU立即终止,目前正在处理中,处理中断的过程。当前CPU挂了,目前正在处理中执行中断处理的过程中,也被称为中断切换。然而,这样的切换比进程切换音量较低,和任何中断的优先级通常高于任何过程,因为我们指的是硬件中断。中断分为上下两半,在一般情况下,上部是CPU在处理的时候,把它放在,到内存中,如果不是特别紧急(CPU或内核会判断为自己),所以在这种情况下,CPU返回到SC只是在继续等待进程。当这个过程完成后,再返回到中断执行的下部。


在32位系统中,在我们的记忆中(线性地址)的地址空间,一般来说,低地址空间有一个G是用于核,和3克以上用于过程。但我们应该了解,事实上,在内核的内存,然后放下,不直接这样,32位系统和64位系统可能是不同的(物理地址),并在32位系统中,有超过10米的空间用于DMA的最底端的DNA总线宽度很小,并有可能只有几个,因此,处理能力是有限的,访问的内存空间是有限的。如果DMA需要复制数据,但他们也可以解决物理内存,数据可以直接转化为强烈的记忆,所以我们必须保证内存可以寻址DMA,寻址的前提是给最小地址m,在DA到DMA地址范围内的段落,所以从这个角度来看,我们的内存管理是分区域的。


在32位系统,16M内存空间zone_dma(物理地址空间使用的DMA);从16M到896m到zone_normal(正常的物理地址空间),Linux为操作系统,内核是直接访问的地址空间;从896m 1G的这个空间(称为保留物理保留的地址空间);从1G到4G的物理地址空间,内核不能直接访问,访问必须把一块内容映射到保留,它保留了一个内存地址编码保留,所以我们可以访问内核。物理地址空间内核没有直接访问超过1G的权限,所以在32位系统上,它可以访问内存中的数据,中间需要一个额外的步骤。


在64位系统,zone_dam给低端1g地址空间。此时,DMA的寻址能力大大增强。zone_dam32可以使用4G的空间,1G以上,分zone_normal,空间可以由内核直接访问。所以,在64位内核访问大于1G的内存地址,因此不需要额外的步骤,以及性能和效率也大大提高。这就是为什么使用64位系统的原因。


在目前的PC架构,AMD和相互支持的机制被称为豌豆(物理地址扩展)。所谓的PAE。它指的是对32位系统的地址总线4位扩展,在32位系统的地址空间可以达到64G。当然,在32系统,没有不管你有多大的物理内存,由一个单一的过程中使用的空间不延长。因为在32位系统中,只有4个G的线性地址空间,只有3克,可以由一个单一的过程访问。


Linux的虚拟内存子系统包含以下功能模块:


slab分配器,分配器划哥们,MMU,kswapd,bdflush


板坯分配器称为板坯分配器。


好友分配器也称为伙伴系统,称为伙伴系统和内存分配器。


伙伴系统是工作在MMU和slab分配器的工作伙伴系统。


设置为小于或等于1G时,数据库服务器应避免使用内存交换。


三.在应用服务器上,它可以被设置为ram * 0.5,当然,这是一个理论值。


如果Exchange存储不使用交换内存应放在最大的磁带,因为最外层的磁盘访问速度是最快的。所以,如果你有多个硬盘,你可以把每个硬盘的最外层轨道的一小部分作为一个交换分区,交换分区可以定义优先级,所以设置这些硬盘交换内存优先级是相同的,和负载均衡的效果是可以实现的。定义的交换分区的优先级的方法是编辑 / / fstab等:


/ dev / sda1交换优先级= 5 00


/ dev / sdb1交换优先级= 5 00


/ dev / SDC1交换优先级= 5 00


/ dev / SDD1交换优先级= 5 00


四。用于内存耗尽的相关调优参数


当Linux内存不足时,它将杀死占用大部分内存的进程,下面的三个案例将杀死进程:


1。所有进程都是活动进程,此时没有空闲进程进行交换。


2。没有可用的页面,页面是在zone_normal


三.还有其他的新进程要启动,当你申请内存空间时,你需要找到一个空闲的内存映射,但是现在找不到了。


一旦内存耗尽,OOM杀伤机制将由操作系统启用。


在 / / PID /proc目录,有一个文件名为oom_score,用于指定的房间,那是得分,坏蛋指数。


如果你想手动激活OOM杀伤机制,你只需要执行回波F> / proc /键触发,它会自动杀进程,我们指定的不良指数得分最高。


坏蛋评分指标的过程可以通过回声N> / proc / PID / oom_adj.the最终得分指数是2的oom_adj.if我们一个过程的oom_adj值5 N次调整,那么它的混蛋评分指数是5的2倍。


如果你想禁止OOM杀的使用功能,你可以使用虚拟机。panic_on_oom = 1。


五。与容量相关的内存调优参数:


overcommit_memory,3可用的参数,指定是否可以使用内存:


0:默认设置,内核执行启发式过度使用处理。


1:内核执行一个无内存的过度使用过程。使用这个值会增加内存过载的可能性。


2:内存使用量是相等的互换规模+ RAM * overcommit_ratio的价值。如果你想减少内存使用,这个值是最安全的


overcommit_ratio:指定overcommit_memory 2,和物理内存比默认的50设置


六。与通信有关的调谐参数


在同一主机上的进程间通信的一种常用方法:


1。通过消息消息;2。通过信号信号传输;3。通过共享内存进行通信,主机之间的通用通信方式是RPC。


实现了进程通信的消息优化方案。


Msgmax:指定在消息队列消息的字节允许的最大大小。此值不得超过该队列的大小(msgmnb),默认值是65536


Msgmnb:指定最大值(最大长度)在字节一个消息队列的默认值是65536字节。


Msgmni:指定消息队列标识的最大数目(和队列的最大数目),64的默认值是1985位架构的机器;32的默认值是1736位架构的机器


共享内存模式下进程通信的调优方案:


Shmall:指定共享内存总量,可以在系统中使用(一个单一应用的上限)的字节数。


Shmmax:指定在每个字节的共享内存段的最大大小


Shmmni:指定最大共享内存片段在系统范围。默认值是4096,64和32位的系统


七。与容量相关的文件系统可以调整到参数:


列出了由内核分配的文件句柄的最大值。


dirty_ratio:指定的百分比,当脏数据达到该比例系统的总内存数的pdflush开始执行,默认是20


dirty_background_ratio:指定百分比。当脏页由一个进程占用的百分比达到系统的总内存的百分比,pdflush在后台执行。默认值是10。


dirty_expire_centisecs:pdlush打开和刷新脏页每百分之一秒,默认值是3000,那么每30秒,它开始刷新脏页。


dirty_writeback_centisecs:开始每百分之一秒刷新一个脏页的默认值是500,因此一个脏页的存在达到5秒开始刷新脏。


八、linux内存常用的观察索引命令:


记忆活动


vmstat { } { }区间数


SAR - {区间} }计数}


内存变化率


合成孔径雷达


frmpg /:内存页面发布或每秒分配是这样的,如果是正数,内存页面发布;如果为负,内存页分配。


bufpg /:内存页面获得或缓冲每秒被释放。如果获得阳性数、内存页是负的内存页的释放。


campg /:一个内存页缓存中获得或每秒所释放的。如果获得阳性数、内存页是负的内存页的释放。


交换活动


SAR


所有IO


SAR -时间间隔


写入内核从磁盘pgpgin /的块的数量:每二


文字从核盘pgpgout /的块的数量:每二


故障 /:不分页的例外的每秒数


majflt /:大页例外每秒数


pgfree /:返回每秒页面数