免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: blake326

[内存管理] cache/buffer, anon, mmap 三类page的状态和生命周期转换。 [复制链接]

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
发表于 2012-05-24 20:25 |显示全部楼层
回复 11# blake326



read系统调用产生的buffer/cache page
       page_mapped返回0. page->_mapcount=-1

===========================

那你找到在mmap的时候,哪里增加的这个_mapcount值没有?

再一个就是不知fengguang这张图中pte_young是个啥?

cc.png

   

论坛徽章:
0
发表于 2012-05-24 21:37 |显示全部楼层
回复 12# embeddedlwp




    do_linear_fault
__do_fault
                        page_add_file_rmap(page);


void page_add_file_rmap(struct page *page)
{
        if (atomic_inc_and_test(&page->_mapcount)) {
                __inc_zone_page_state(page, NR_FILE_MAPPED);
                mem_cgroup_inc_page_stat(page, MEMCG_NR_FILE_MAPPED);
        }
}

论坛徽章:
0
发表于 2012-05-25 09:33 |显示全部楼层
本帖最后由 blake326 于 2012-05-25 09:33 编辑

回复 12# embeddedlwp



pte关联的地址被访问时自动置为。pte_young检测pte是否最近被access过。
    static inline int pte_young(pte_t pte)
{
        return pte_flags(pte) & _PAGE_ACCESSED;
}

filemap,anon的page相关的pte被access过,那么就不会释放,然后kernel 清除access位。下次再来释放该page的时候,如果access还是清除的话,那么久真的释放了。

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
发表于 2012-05-25 12:04 |显示全部楼层
分享清磁盘高速缓存的方法


To free pagecache:

# echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:

# echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:

echo 3 > /proc/sys/vm/drop_caches

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
发表于 2012-05-27 17:49 |显示全部楼层
回复 1# blake326

v.png

从这张图来看貌似read/write的page在第二次access的时候为active
而mapped pages第一次就active吧?

再比如在页换入的时候,在read_swap_cache_async函数中,页直接就添加的active,而不是从先加到inactive,然后mark_page_accessed


   

论坛徽章:
0
发表于 2012-05-28 09:12 |显示全部楼层
回复 16# embeddedlwp


   最新的代码(至少38以后肯定是的)filemap的page在缺页异常时没有mark_page_accessed, PG_referenced也没有置为。

   所以shrink_page_list的时候,会KEEP在inactive list中。

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
发表于 2012-05-28 19:48 |显示全部楼层
回复 17# blake326

为什么filemap的page一次就active,而read/write得两次
这样read/write的page比filemap更容易被回收掉
为什么对filemap的这样保护?


   

论坛徽章:
0
发表于 2012-05-28 20:23 |显示全部楼层
embeddedlwp 发表于 2012-05-28 19:48
回复 17# blake326

为什么filemap的page一次就active,而read/write得两次


anon 最重要
filemap 其次
buffer/cache 最不重要

具体的表现:
buffer/cache 只mark_page_accessed一次的话(一般至少一次),shrink_inactive_list会直接释放它。
filemap只访问一次的话,第一次shrink_inactive_list会把他keep在inactive list中,第二次shrink_inactive_list就会释放它。
anon page只访问一次的话,第一次shrink_active_list会把他移到inactive list中,然后下次shrink_inactive_list就会释放它。

anon page直接就在 active list中,一般系统比较少才能调用到shrink_active_list,更突出了它的重要性。
你的帖子ubuntu为什么free内存这么少,其实就是buffer/cache很多,加进来的释放的主要都是cache,shrink_active_list调用比较少。



论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-05-29 10:07 |显示全部楼层
本帖最后由 瀚海书香 于 2012-05-29 10:07 编辑

多谢分享!
对page cache这块了解的更清楚了

   

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
发表于 2012-05-29 11:41 |显示全部楼层
回复 19# blake326


anon page直接就在 active list中,一般系统比较少才能调用到shrink_active_list,更突出了它的重要性。
你的帖子ubuntu为什么free内存这么少,其实就是buffer/cache很多,加进来的释放的主要都是cache,shrink_active_list调用比较少。

=============================================================

红色的部分怎么看出来的,貌似是swap tendency >= 100也就是你说的系统内存紧张时,从lump reclaim回收的page更有可能被
放到inactive。调不调用shrink_active_list与系统的紧张程度有关,进而影响回收的priority,那么紧张的话shrink_active_list和shrink_inactive_list
都会调用到。如果系统不是很紧张,而且要扫描的page数没有超过threshold sc->swap_cluster_max,那么就不会往下执行啊,接着在direct page reclaim path
和swap daemon path都会调用shrink_slab从icache,dcahce回收
  1. static unsigned long shrink_zone(int priority, struct zone *zone,
  2.                                 struct scan_control *sc)
  3. {
  4.         unsigned long nr_active;
  5.         unsigned long nr_inactive;
  6.         unsigned long nr_to_scan;
  7.         unsigned long nr_reclaimed = 0;

  8.         /*
  9.          * Add one to `nr_to_scan' just to make sure that the kernel will
  10.          * slowly sift through the active list.
  11.          */
  12.         zone->nr_scan_active +=
  13.                 (zone_page_state(zone, NR_ACTIVE) >> priority) + 1;
  14.         nr_active = zone->nr_scan_active;
  15.         if (nr_active >= sc->swap_cluster_max)
  16.                 zone->nr_scan_active = 0;
  17.         else
  18.                 nr_active = 0;

  19.         zone->nr_scan_inactive +=
  20.                 (zone_page_state(zone, NR_INACTIVE) >> priority) + 1;
  21.         nr_inactive = zone->nr_scan_inactive;
  22.         if (nr_inactive >= sc->swap_cluster_max)
  23.                 zone->nr_scan_inactive = 0;
  24.         else
  25.                 nr_inactive = 0;

  26.         while (nr_active || nr_inactive) {
  27.                 if (nr_active) {
  28.                         nr_to_scan = min(nr_active,
  29.                                         (unsigned long)sc->swap_cluster_max);
  30.                         nr_active -= nr_to_scan;
  31.                         shrink_active_list(nr_to_scan, zone, sc, priority);
  32.                 }

  33.                 if (nr_inactive) {
  34.                         nr_to_scan = min(nr_inactive,
  35.                                         (unsigned long)sc->swap_cluster_max);
  36.                         nr_inactive -= nr_to_scan;
  37.                         nr_reclaimed += shrink_inactive_list(nr_to_scan, zone,
  38.                                                                 sc);
  39.                 }
  40.         }

  41.         throttle_vm_writeout(sc->gfp_mask);
  42.         return nr_reclaimed;
  43. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP