2011年11月7日星期一

sysctl 中 vm.overcommit_memory 的含义



vm.overcommit_memory 表示内核在分配内存时候做检查的方式。这个变量可以取到0,1,2三个值。对取不同的值时的处理方式都定义在内核源码 mm/mmap.c 的 __vm_enough_memory 函数中。

取 1 的时候 :
此时宏为 OVERCOMMIT_ALWAYS,函数直接 return 0,分配成功。

取 2 的时候:
此时宏为 OVERCOMMIT_NEVER,内核计算:内存总量×vm.overcommit_ratio/100+SWAP 的总量,如果申请空间超过此数值,则分配失败。vm.overcommit_ratio 的默认值为50。

取 0 的时候:
此时宏为 OVERCOMMIT_GUESS,内核计算:NR_FILE_PAGES 总量+SWAP总量+slab中可以释放的内存总量,如果申请空间超过此数值,则将此数值与空闲内存总量减掉 totalreserve_pages(?) 的总量相加。如果申请空间依然超过此数值,则分配失败。

以上为粗略描述,在实际计算时,如果非root进程,则在计算时候会保留3%的空间,而root进程则没有该限制。详细过程可看源码。

大概过程如上所述,但还有很多数据结构还没搞清楚。

2011年11月4日星期五

resolv.conf 的配置和dns解析的关系

本文为笔记,部分地方不准确。目的:resolv.conf 中配置了 search 选项和 domain 选项后,检查系统查询域名的步骤和行为。

0 若不存在 resolv.conf,则将本机做为dns服务器,然后取主机名的domain,然后附加到域名中进行查询。查询时首先查询AAAA记录,再查询A记录。以下均为查询nxyi-dns2.hst.xyi.cn.xdc.net时,得到的不同结果。

1 若没有search(最长为6个)和domain选项,则取主机名的domain,然后附加到域名中进行查询:

17-Oct-2011 23:35:17.536 queries: client 172.22.41.176#44119: query: nxyi-dns2.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:35:17.536 queries: client 172.22.41.176#56562: query: nxyi-dns2.hst.xyi.cn.xdc.net.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:35:17.536 queries: client 172.22.41.176#53616: query: nxyi-dns2.hst.xyi.cn.xdc.net IN A +

2 如有domain,(domain xdc.net)则,附加domain到域名中进行查询:

17-Oct-2011 23:38:02.031 queries: client 172.22.41.176#43411: query: nxyi-dns2.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:38:02.031 queries: client 172.22.41.176#41697: query: nxyi-dns2.hst.xyi.cn.xdc.net.xdc.net IN AAAA +
17-Oct-2011 23:38:02.031 queries: client 172.22.41.176#35978: query: nxyi-dns2.hst.xyi.cn.xdc.net IN A +

3 若有多个search (search hst.xyi.cn.xdc.net hst.dsl.crm.xdc.net hst.x.dw.xdc.net) 则依次附加,然后查询,顺序依然首先查询AAAA记录,再查A记录:

17-Oct-2011 23:39:25.272 queries: client 172.22.41.176#49875: query: nxyi-dns2.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:39:25.272 queries: client 172.22.41.176#36371: query: nxyi-dns2.hst.xyi.cn.xdc.net.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:39:25.272 queries: client 172.22.41.176#33367: query: nxyi-dns2.hst.xyi.cn.xdc.net.hst.dsl.crm.xdc.net IN AAAA +
17-Oct-2011 23:39:25.272 queries: client 172.22.41.176#42772: query: nxyi-dns2.hst.xyi.cn.xdc.net.hst.x.dw.xdc.net IN AAAA +
17-Oct-2011 23:39:25.273 queries: client 172.22.41.176#45355: query: nxyi-dns2.hst.xyi.cn.xdc.net.xdc.net IN AAAA +
17-Oct-2011 23:39:25.273 queries: client 172.22.41.176#35669: query: nxyi-dns2.hst.xyi.cn.xdc.net IN A +

4 若nxyi-dns5.hst.xyi.cn.xdc.net没有找到,则附加search进行查询A记录:

17-Oct-2011 23:52:21.527 queries: client 172.22.41.176#56298: query: nxyi-dns5.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:52:21.528 queries: client 172.22.41.176#40880: query: nxyi-dns5.hst.xyi.cn.xdc.net.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:52:21.528 queries: client 172.22.41.176#40359: query: nxyi-dns5.hst.xyi.cn.xdc.net IN A +
17-Oct-2011 23:52:21.528 queries: client 172.22.41.176#36129: query: nxyi-dns5.hst.xyi.cn.xdc.net.xyi.cn.xdc.net IN A +

5 若存在ndots:6,则由于域名仅仅包含了5个点,则顺序改变,首先附加search查找,然后再查找域名本身。默认为ndots值为1,即域名只要包含一个点,就不会首先附加search:

17-Oct-2011 23:53:04.260 queries: client 172.22.41.176#50630: query: nxyi-dns5.hst.xyi.cn.xdc.net.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:53:04.260 queries: client 172.22.41.176#38081: query: nxyi-dns5.hst.xyi.cn.xdc.net IN AAAA +
17-Oct-2011 23:53:04.260 queries: client 172.22.41.176#36043: query: nxyi-dns5.hst.xyi.cn.xdc.net.xyi.cn.xdc.net IN A +
17-Oct-2011 23:53:04.260 queries: client 172.22.41.176#58401: query: nxyi-dns5.hst.xyi.cn.xdc.net IN A +

总结:
系统查询域名主要使用 gethostbyname(过时) 和 getaddrinfo 两个函数,二者接收的参数和返回的数据类型都不相同。其中 gethostbyname 实际调用 gethostbyname2,根据传递的参数可以查询AAAA或者A记录。getaddrinfo 功能更强大,可以控制是查询AAAA,A,或者先AAAA后A记录。详细可见glibc中 resolv/gethnamaddr.c 和 sysdeps/posix/getaddrinfo.c 中的实现。