免费注册 查看新帖 |

Chinaunix

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

[内存管理] 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-28 18:53 |显示全部楼层
回复 28# firkraag

在2.6.24代码中:

在swap out的时候会调用的swap_write_page函数中,会直接调用remove_exclusive_swap_page(page);,如果是完全swap out了,就删除相应的swap cache中的item
但是在swap in的时候会有个判断,只有swap cache至少占满50%的时候才会调用remove_exclusive_swap_page(page);
if (vm_swap_full())
                remove_exclusive_swap_page(page);
其他调用remove_exclusive_swap_page(page);的地方貌似只有在free_page的过程中。

那么为什么对swap in的时候的swap cache如此保护?


   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
发表于 2012-05-29 09:54 |显示全部楼层
本帖最后由 firkraag 于 2012-05-29 09:54 编辑

我觉得这大概就我在http://bbs.chinaunix.net/thread-3748105-2-1.html中的说的先占住slot,反正swap area现在也不紧张(used percent<50%)。要是下次还被换出时,就不用再费力找slot了。

论坛徽章:
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:01 |显示全部楼层
回复 32# firkraag



为什么不是在swap out的时候占住坑,这样swap in的时候就不用找了?

   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
发表于 2012-05-29 11:35 |显示全部楼层
回复 33# embeddedlwp
这个坑(slot)就是在swap out时占住的,这里(swap in时)就是要判断是不是要把它释放掉。
   

论坛徽章:
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:52 |显示全部楼层
回复 12# 塑料袋


一般都说交换分区不要设置超过内存两倍,那么从kernel的角度来看,是不是就是因为只有anon page和shm 使用swap area,所以设大了也没有?


   

论坛徽章:
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 12:04 |显示全部楼层
回复 34# firkraag

你这个坑字儿把我绕晕了!

在31楼,我说的slot是指swap cache中的,不是swap area中的。
我的问题是在完全swap out的时候,相应swap cache中的slot会删掉
但是为什么完全swap in的时候,相应的swap cache中的slot并不是总删掉,在swap cache的percent < 50%的时候不立即删掉?


   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
发表于 2012-05-29 12:53 |显示全部楼层
本帖最后由 firkraag 于 2012-05-29 12:57 编辑

swap in的情况,percent < 50%的时候swap area压力不大,就让它占着呗,它还可能在不久的将来被换出,这不就省得再到swap area中去分配slot了吗。swap out的时候,它都已经被完全换出了,我们在那时不就是要回收那一页吗?那还让它继续待在swap 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 12:59 |显示全部楼层
本帖最后由 embeddedlwp 于 2012-05-29 13:09 编辑

回复 37# firkraag

在filemap的page fault中:

do_linear_fault->__do_fault->filemap_fault->page_cache_read:
  1. static int fastcall page_cache_read(struct file * file, pgoff_t offset)
  2. {
  3.         struct address_space *mapping = file->f_mapping;
  4.         struct page *page;
  5.         int ret;

  6.         do {
  7.                 page = page_cache_alloc_cold(mapping);
  8.                 if (!page)
  9.                         return -ENOMEM;

  10.                 ret = add_to_page_cache_lru(page, mapping, offset, GFP_KERNEL);
  11.                 if (ret == 0)
  12.                         ret = mapping->a_ops->readpage(file, page);
  13.                 else if (ret == -EEXIST)
  14.                         ret = 0; /* losing race to add is OK */

  15.                 page_cache_release(page);

  16.         } while (ret == AOP_TRUNCATED_PAGE);
  17.                
  18.         return ret;
  19. }
复制代码
在add_to_page_cache_lru函数中把page添加进了inactive链表,怎么在page_cache_release函数中又从链表移除了?
在__do_fault中会判断,如果这个page是anon的,那么直接加到active,但是没看到filemap的page在page_cache_release后加到哪里了
还有为什么在__do_fault中判断是不是anon的,do_linear_fault这条path应该就是为filemap准备的啊,anon page有自己的处理函数do_anonymous_page啊!



   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
发表于 2012-05-29 13:50 |显示全部楼层
回复 38# embeddedlwp
早期版本_count初始值为-1,现在版本好像已经开始从0开始取值,page_cache_release要检查page的_count,在此处应该不会被移除。
   

论坛徽章:
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 13:55 |显示全部楼层
回复 39# firkraag


/*
                 * Find out how many pages are allowed for a single swap
                 * device. There are two limiting factors: 1) the number of
                 * bits for the swap offset in the swp_entry_t type and
                 * 2) the number of bits in the a swap pte as defined by
                 * the different architectures. In order to find the
                 * largest possible bit mask a swap entry with swap type 0
                 * and swap offset ~0UL is created, encoded to a swap pte,
                 * decoded to a swp_entry_t again and finally the swap
                 * offset is extracted. This will mask all the bits from
                 * the initial ~0UL mask that can't be encoded in either
                 * the swp_entry_t or the architecture definition of a
                 * swap pte.
                 */
                maxpages = swp_offset(pte_to_swp_entry(swp_entry_to_pte(swp_entry(0,~0UL)))) - 1;
               
这个获得maxpages的过程怎么理解,看了注释依然一头污水雾水!

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP