当前位置: 技术问答>linux和unix
高手帮忙解释下linux如何对一个服务器的进程进行内存分配?
来源: 互联网 发布时间:2016-03-10
本文导语: 大家好,有个问题一直没有弄明白,查了些资料也是一头雾水。就是关于linux上一个服务器的进程,系统是如何分配内存,在存在多个连接的时候,它们之间是如何共享内存的呢?比如mysqld进程,系统启动时分配了一些...
大家好,有个问题一直没有弄明白,查了些资料也是一头雾水。就是关于linux上一个服务器的进程,系统是如何分配内存,在存在多个连接的时候,它们之间是如何共享内存的呢?比如mysqld进程,系统启动时分配了一些内存给它,在有连接进行插入操作时,会占用到比较多的内存,如果有多个连接同时进行插入操作,它们之间的内存是如何分配与共享的呢?我看到说linux将空闲的内存作为cache使用,来提高性能,在将所有的连接退出后,可以看到mysqld的RSS减少并不多,比如原来有40个连接时RSS是178M,这40个连接退出后,mysqld的RSS大概在155M左右,那哪些是释放出来的,哪些是仍然算在RSS中的呢?linux对这种进程内存的使用原理是什么样的?希望有高手给予指点!谢谢!
|
简单的讲,
当系统释放内存页面时,并不立即把这些内存页面释放,而是把内存页面的相应标志置位。对于这样的页面,如果有系统请求到来,需要从新使用这些页面时,仅仅简单的把标志位置上就可以了。这样能极大的提高系统的响应速度。
系统内部有个线程,定时检查这些已经置位的页面,根据一定的策略,来定时真正的释放一些这样的页面。
另外,当系统申请其他空闲内存页面得不到满足时,也会释放一些这样的页面来供其他地方使用。
当系统释放内存页面时,并不立即把这些内存页面释放,而是把内存页面的相应标志置位。对于这样的页面,如果有系统请求到来,需要从新使用这些页面时,仅仅简单的把标志位置上就可以了。这样能极大的提高系统的响应速度。
系统内部有个线程,定时检查这些已经置位的页面,根据一定的策略,来定时真正的释放一些这样的页面。
另外,当系统申请其他空闲内存页面得不到满足时,也会释放一些这样的页面来供其他地方使用。
|
首先RSS是驻内存页面集合。每个进程都有自身的虚存空间,而虚存空间是被映射了的物理页面集合。而在内存的部分就是RSS。
因此看一个进程耗费多少资源,不能只看RSS。
在linux 中一般用户空间的进程的大小在理论上都是3G,当然先开始一般是有预先分配的堆栈, 当堆栈不够用时,会有一些办法,调用do_page_fault来申请空间,malloc 来申请空间,
这些都是内存管理模块提供的接口,最终的分配是从每个内存管理区的free_list. 全局的inactive_clean_list,将内容交换到设备上的inactive_dirty_list,LUR队列,或者是在系统紧张,可以释放掉一些slab中的无用内存,来满足需求。
因此看一个进程耗费多少资源,不能只看RSS。
在linux 中一般用户空间的进程的大小在理论上都是3G,当然先开始一般是有预先分配的堆栈, 当堆栈不够用时,会有一些办法,调用do_page_fault来申请空间,malloc 来申请空间,
这些都是内存管理模块提供的接口,最终的分配是从每个内存管理区的free_list. 全局的inactive_clean_list,将内容交换到设备上的inactive_dirty_list,LUR队列,或者是在系统紧张,可以释放掉一些slab中的无用内存,来满足需求。
|
>> 在将所有的连接退出后,可以看到mysqld的RSS减少并不多,比如原来有40个连接时RSS是178M,这40个连接退出后,mysqld的RSS大概在155M左右
那是因为mysql把这些数据缓存了,所以没有释放
那是因为mysql把这些数据缓存了,所以没有释放
|
redhat 有专门的内存管理程序,命令下的忘了,图像模式下的你可以在设置里看下。