免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2208 | 回复: 7
打印 上一主题 下一主题

ip_conntrack_core.c 中初始化 hash 表大小的不解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-18 23:16 |只看该作者 |倒序浏览
        /* Idea from tcp.c: use 1/16384 of memory.  On i386: 32MB
         * machine has 256 buckets.  >= 1GB machines have 8192 buckets. */
        if (!ip_conntrack_htable_size) {
                ip_conntrack_htable_size
                        = (((num_physpages << PAGE_SHIFT) / 16384)
                           / sizeof(struct list_head));
                if (num_physpages > (1024 * 1024 * 1024 / PAGE_SIZE))
                        ip_conntrack_htable_size = 8192;

                if (ip_conntrack_htable_size < 16)
                        ip_conntrack_htable_size = 16;
        }

为什么当大于 1GB 内存时仅仅强行指定为 8192?
如果把这个判断处理删掉是否能够更大发挥 conntrack 在 hash 方面的效率?

论坛徽章:
0
2 [报告]
发表于 2007-12-19 08:56 |只看该作者
>>为什么当大于 1GB 内存时仅仅强行指定为 8192?

可能是防止过多占用内存吧,如果系统不是专门做防火墙或网关的

>>如果把这个判断处理删掉是否能够更大发挥 conntrack 在 hash 方面的效率?

自然

论坛徽章:
0
3 [报告]
发表于 2007-12-19 10:11 |只看该作者
原帖由 qtdszws 于 2007-12-19 08:56 发表
>>为什么当大于 1GB 内存时仅仅强行指定为 8192?

可能是防止过多占用内存吧,如果系统不是专门做防火墙或网关的

>>如果把这个判断处理删掉是否能够更大发挥 conntrack 在 hash 方面的效率?

自然

我体会不是很深,但记忆中记得说内核空间内存访问是有限制的,是否和这个有关呢?

论坛徽章:
0
4 [报告]
发表于 2007-12-19 10:19 |只看该作者
>>我体会不是很深,但记忆中记得说内核空间内存访问是有限制的,是否和这个有关呢?

我认为不是的

8192*sizeof(struct list_head)=8192*8=16K,也没有多大

论坛徽章:
0
5 [报告]
发表于 2007-12-19 10:28 |只看该作者
原帖由 qtdszws 于 2007-12-19 10:19 发表
8192*sizeof(struct list_head)=8192*8=16K,也没有多大

这个是怎么来的呢?

  1.                ip_conntrack_htable_size
  2.                         = (((num_physpages << PAGE_SHIFT) / 16384)
  3.                            / sizeof(struct list_head));
复制代码

PAGE_SHIFT 在 arch-i386 上是 12
sizeof(struct list_head) 是 8
num_physpages 的值是哪里得来的呢?我只在 mm/memory.c 中看到有 EXPORT_SYMBOL,没看到具体数值来源

论坛徽章:
0
6 [报告]
发表于 2007-12-19 10:34 |只看该作者
>>这个是怎么来的呢?
哪里看不懂?

>>num_physpages 的值是哪里得来的呢?
void __init mem_init(void)
{
#ifdef CONFIG_HIGHMEM
        highmem_start_page = mem_map + highstart_pfn;
        max_mapnr = num_physpages = highend_pfn;
#else
        max_mapnr = num_physpages = max_low_pfn;
#endif
}

论坛徽章:
0
7 [报告]
发表于 2007-12-19 10:58 |只看该作者
我查了一下,highend_pfn 取自 max_pfn(当定义 HIGHMEM 的时候)
max_pfn 又取自 for(i=0; i<nr_nodemap_entries; i++) max(max_pfn, early_node_map[i].end_pfn);
但我又找不到 nr_nodemap_entries 和 early_node_map.end_pfn 是哪里来的
彻底晕了……

请问 num_physpages 究竟代表什么意思?

论坛徽章:
0
8 [报告]
发表于 2007-12-19 12:40 |只看该作者
物理页数目.

可以在命令行上制定hash 的大小, 覆盖这里的计算分配.

原帖由 platinum 于 2007-12-19 10:58 发表
我查了一下,highend_pfn 取自 max_pfn(当定义 HIGHMEM 的时候)
max_pfn 又取自 for(i=0; i
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP