linux性能优化2-内存相关知识
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux性能优化2-内存相关知识相关的知识,希望对你有一定的参考价值。
1.Linux内存体系结构
一个进程执行时,Linux内核给其分配一个部分内存区域。进程使用这个内存区域作为工作区执行必要的操作。
1.1.物理内存和虚拟内存
系统的内存管理是非常复杂的,一般由内核来完成。高效的内存管理对于提升进程的性能至关重要。现代的计算机系统使用分页(page)技术安全和灵活地管理系统内存。为了提高效率,计算机系统上的内存由固定大小的chunk组成,被称为分页(page)分页的大小取决于处理器体系结构,i386和x86_64中的分页大小是4KB。系统上的物理内存被分成页帧(page frame),一个页帧包含数据的一个分页。
1)页帧分配
一个分页是物理内存或虚拟内存中一组连续线性地址。Linux内核以内存页为单位处理内存。一个内存页通常是4KB大小。当一个进程请求一定数量内存页的时候,如果有有效的内存页,Linux内核立刻将它们分配给进程。否则,需要从一些其他的进程或分页缓存中得到。内核知道有多少内存页是有效的,并且也知道它们在什么位置。进程是不能直接对物理内存寻址的,取而代之的是,每个进程都有一个虚拟地址空间。当为一个进程分配内存时,页帧的物理地址被映射到进程的虚拟地址。从进程的角度看,它有一个私有的地址空间,它只能看到已经对物理页帧做了映射的一个虚拟地址。除此之外,这样还有助于加强进程直接的安全限制和明确界限。
2)虚拟内存寻址布局
在32位的架构上,单个进程可以访问的最大地址空间是4GB,这是由于32位虚拟地址本身具有的限制。在一个标准的实现中,虚拟地址空间被划分为3GB用户空间和1GB的内核空间。但是在64位的架构上比如x86_64和IA-64中,没有这样的限制,每个进程都可以访问巨大的地址空间。
1.2.为什么说32位系统只能支持最大4G的物理内存,而64位的系统可以支持TB级别的内存?
一个进程虚拟地址空间的大小取决于处理器架构。在32位i386系统上,一个进程的虚拟地址空间大小是2的32次方B(4GB),由于32位i386的系统上的寻址空间是4GB,所以32位系统只能支持最大4G的物理内存;64位x86系统上,理论上支持2的64次方B的寻址空间,所以64位的系统支持更大的物理内存,实际上支持多少内存要看主板能支持多少。
1.3.虚拟内存管理
一个操作系统的物理内存架构对于应用程序和用户来说通常是隐藏的,因为操作系统可以将任何物理内存映射到虚拟内存。系统不会给程序分配物理内存,但是它会向Linux内核请求一定大小的虚拟内存,并在虚拟内存中交换得到的映射。虚拟内存不必映射到物理内存,如果你的程序被分配了大量的内存,则有一部分可能被映射到磁盘的swap文件上。应用程序通常不直接向磁盘中写入数据,而是向高速缓存(cache)或缓冲区(buffer)写入。当时间片到达时,或者一个文件的大小超出缓冲缓冲时,内核线程会将缓存/缓冲中的数据刷新到磁盘中。与Linux内核处理写入磁盘系统紧密相关的是Linux内核管理磁盘缓存的方式。其他操作系统仅分配某一部分内存作为磁盘缓存,而Linux可以更有效地处理内存资源。管理虚拟内存的默认配置是:分配所有有效的空闲内存空间作为磁盘缓存。在同样的情况下,Linux也可以非常有效地处理swap空间。正在使用的swap空间不一定是内存瓶颈,有时候可以证明Linux如何有效地处理系统资源。
1.4.分页维护
1)伙伴系统
Linux内核使用一种被称为伙伴系统(buddy system)的机制来维护空闲分页。伙伴系统维护空闲分页,并尝试给分页分区请求分配分页。它试图保持内存区域是连续的。如果不考虑分散的小分页,这可能会导致内存碎片,并会导致更加难以在连续的区域中分配一个很大的分页,它可能导致低效的内存使用和性能下降。
2)分页回收
当一个进程请求映射一定数量分页的时候,如果没有有效的分页,Linux内核将尝试释放一定数量的分页(这是之前使用但是现在不在使用且基于某些原因仍被标记的活跃分页),然后将这些分页分配给新请求内存的进程。这个过程被称为分页回收(page reclaiming)。内核线程kswapd和内核函数try_to_free_page()负责分页回收。kswapd在任务中通常处于可中断的睡眠状态,当区域中的空闲分页低于一个阈值时它被称为伙伴系统。基于最近最少使用(Least Recently Used,LRU)原则,它试图找到候选分页并将其取出作为活跃分页。最近最少使用的分页首先被释放。活跃列表和非活跃列表用于维护候选分页。kswapd扫描活跃列表,并检查最近使用的分页,将最近没有使用的分页放入非活跃列表可以通过vmstat -a命令查看活跃和非活跃的内存有多少。
kswapd也遵循另一个原则。分页的使用主要有两个目的:分页缓存(page cache)和进程地址空间(porcess address space)。分页缓存是分页被映射到磁盘上的一个文件。分页属于一个进程地址空间,它被用于堆和栈。当kswapd回收分页的时候,它宁可缩小分页缓存也不愿分页 移出(page out或swap out)进程拥有的分页。
3)swap
当分页回收时,在非活跃列表中属于进程地址空间的候选分页可以被分页移出。交换这种情况本身不是问题,在其他操作系统中,交换无非是为了保证主内存的分配,而Linux使用交换技术能够更加有效的使用空间。虚拟内存由物理内存和磁盘系统或swap分区组成。如果在Linux中虚拟内存管理器发现内存分页已经被分配,但是大量时间还没有使用完,它会将这个内存分页移动到swap空间。一些守护进程,比如getty,当系统启动 时它就启动,但是很少被使用。看来,更有效的方法是,释放一个昂贵的主内存分页并将其移动到swap区。这就是Linux中处理swap分区的方法,如果你发现swap分区被填充了50%,也不用惊慌。swap空间的使用率高并不一定表明内存存在瓶颈。
1.5.为什么阿里云服务器没有swap分区?
swap分区或虚拟内存文件,是在系统物理内存不够用的时候,由系统内存管理程序将那些很长时间没有操作内存数据,临时保存到Swap分区虚拟内存文件中,以提高可用内存额度的一种机制。当那些程序要再次重新运行时,会再从Swap分区或虚拟内存文件中恢复之前保存的数据到内存中。 相关操作会导致额外的IO开销,特别是,如果内存使用率已经非常高,而同时IO性能也不是很好的情况下,该机制其实会起到相反的效果:不仅系统性能提升较小(因为内存使用率已经非常高了),而且由于频繁的内存到SWAP的切换操作,会导致产生大量额外的IO操作,导致IO性能进一步降低,最终反而降低了系统总体性能。 同时,为了保证服务器数据安全性和可靠性,阿里云ECS云磁盘使用了分布式文件系统作为云服务器的存储,对每一份数据都进行了强一致的多份拷贝。但是,该机制在保证用户数据安全的同时,由于3倍增涨的IO操作,会导致本地磁盘的存储性能和IO性能要弱一些。
综上,为了避免当系统资源不足时进一步降低ECS云磁盘的IO性能,所以ECS Windows默认没有启用虚拟内存,Linux默认未配置SWAP分区。
以上是关于linux性能优化2-内存相关知识的主要内容,如果未能解决你的问题,请参考以下文章