Linux|系统管理|WEB开发

关注Linux,系统管理,WEB开发以及开源世界

寻找PAGE_SIZE

| Comments

本来这这个帖子是准备作为帖子虚拟化技术漫谈--OpenVZ入门的后记的,因为这件事就是发生在我写这篇文章的时候。
但是一来这个事情和虚拟化,和OpenVZ谈不上什么关系,而来我又多了一篇文章,开玩笑了,因为这篇文章就是一个笑话,故事开始了。

写OpenVZ入门的时候,我提到了如何使用内存分页大小(pagesize)来简单的计算如何设置对应参数的值,我说x86默认是4096,也就是4096。本来这个后面还有一句话--”当然,如果你不确定,也可以用下面的命令来查看”,写道这里,我就开始找这个命令。 最开始我想到的是/proc/meminfo的内如,于是cat /proc/meminfo,结果只在最后发现一个Hugepagesize的值,是4096K,整整大了1024倍。看了一下这个参数,和我要的page_size不是一码事。

然后sysctl -a,sysctl -A均没有发现对我有用的东西。于是googling,找到一篇文章,提到了time命令,说用time -v就可以显示pagesize。窃喜,赶紧测试了一下

[root@mlsx tmp]# time -v pwd
bash: -v: command not found

方法不对?man一把,没有发现-v选项,但是看到了这个

%Z (Not in tcsh.) System’s page size, in bytes. This is a per-system constant, but varies between systems.

以为搞定,马上测试,结果得到这样的一些结果:

[root@mlsx tmp]# time "%Z" pwd
bash: fg: %Z: no such job
[root@mlsx tmp]# time +%Z pwd
bash: +%Z: command not found
[root@mlsx tmp]# time --format %Z pwd
bash: --format: command not found
[root@mlsx tmp]# time -o %Z pwd
bash: -o: command not found
.......

差点崩溃 strings time一把,有%Z,就是不知道如何用。

再次进入/proc目录,搜刮了一番,没有发现什么东西。

有点绝望了,ping(xplore行业术语,用户和人打招呼)了一下wf,问问他知道不。
搞研发的就是搞研发的,查了两个命令没有后,就丢一句,看源代码吧。我说我不看,我要以管理员的身份来解决这个问题。
被逼无奈,继续寻找中,wf甚至lspci/lshal/dmidecode都看了,还是没有新进展,我一直觉得这是一特简单的事情,我们怎么就找了这么久,还没有结果呢?

于是我要找一个局外人,ping了一下Rachel,问问她这个问题如何解决。结果她大智若愚的回答我,“我不知道内存分页是什么意思”,难道是我描述本身就有问题?算了,她忙于做经理要做的事情--协调资源。
所以还是我和wf来搞这个事情好了。

wf过了不多久,丢来一个信息

man -k getpagesize getpagesize (2) - get memory page size

我知道,他要写代码的瘾又上来了,果不其然,我还没有看完man,就来了这个信息:

$ ~/code/ccode/test/get_mem_pagesize 
memory page size is 4096

这家伙,手脚也太灵活了吧,这代码就出来了。

我仍然倔强的说,不行,我不要写代码。我要从系统里揪出这个值,肯定有。

于是又开始大海捞针了。

许久未果,我和wf得到一个结论--我们还是看内核源代码吧,那里总能找到(开源的好处又被利用了一次)。

无奈,两人对内核源代码结构都不熟悉,就像两个瞎子(sorry to wf)进入了浩大的迷宫,幸好我们还有一个最后的救命稻草。 牺牲了一些PU资源后,wf最终找到了这个page_size(/usr/src/linux-2.6.18-1.2798.fc6/include/asm-i386)的定义。

#grep "PAGE_SIZE" -B3 -A2 page.h 

/* PAGE_SHIFT determines the page size */ 
#define PAGE_SHIFT 12 
#define PAGE_SIZE (1UL << PAGE_SHIFT) 
#define PAGE_MASK (~(PAGE_SIZE-1)) 

#define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1)) 
#define LARGE_PAGE_SIZE (1UL << PMD_SHIFT)

似乎寻找PAGE_SIZE到这里结束了。wf的担心是,大部分情况下安装了内核源代码吗?

而我的说法却是:命令之所以不出来,是因为用户管理员需要知道参数吗?
而如果程序员需要知道这个值,那他当然会去看源代码或者写程序来校验。

这估计把wf气坏了,心想,那你丫到底想怎么样呀?

呵呵,不想怎么样,只是想找找。

Comments