最开始我想到的是/proc/meminfo的内如,于是cat /proc/meminfo,结果只在最后发现一个Hugepagesize的值,是4096K,整整大了1024倍。看了一下这个参数,和我要的page_size不是一码事。
[separate]
然后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的定义。
#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)
#pwd
/usr/src/linux-2.6.18-1.2798.fc6/include/asm-i386
似乎寻找PAGE_SIZE到这里结束了。wf的担心是,大部分情况下安装了内核源代码吗?
而我的说法却是:命令之所以不出来,是因为用户 和管理员 需要知道参数吗?而如果程序员 需要知道这个值,那他当然会去看源代码或者写程序来校验。
这估计把wf气坏了,心想,那你丫到底想怎么样呀?
呵呵,不想怎么样,只是想找找。
我觉得,如果系统管理员需要知道这个值的时候,他可能不做系统管理了。
或许mlsx也准备提升了?
写前面那篇文章的时候,需要确定一下pagesize的大小,于是就引发了这个插曲。
AT_SYSINFO: 0xde2400
AT_SYSINFO_EHDR: 0xde2000
AT_HWCAP: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe
AT_PAGESZ: 4096
AT_CLKTCK: 100
AT_PHDR: 0x8048034
AT_PHENT: 32
AT_PHNUM: 8
AT_BASE: 0x0
AT_FLAGS: 0x0
AT_ENTRY: 0x8049a30
AT_UID: 0
AT_EUID: 0
AT_GID: 0
AT_EGID: 0
AT_SECURE: 0
AT_PLATFORM: i686
这些AT参数是干嘛的?还有LD_SHOW_AUXV环境变量那里知道?非要看内核代码?呵呵~~
如果一定要维护系统管理员的尊严和纯正血统而弃用 wf 的本来已经够简单的程序,那么可以试试这个:
# LD_SHOW_AUXV=1 /bin/ls | grep PAGESZ | awk {'print $2'}
在page.h 中找到 它的定义。在include 目录下
/usr/bin/time -f %Z true
只是不要用bash内置的time。
我给忘记了我用的是bash里的time,我还用which查了一下路径。
汗颜呀!