- 论坛徽章:
- 0
|
本帖最后由 chenrvmldd 于 2011-04-21 14:36 编辑
前段时间查一个内核问题大概查了一个星期左右,也在论坛上发了很多帖子求救但是无果,异常痛苦!谨以此文记录查问题的全过程,同时将自己解决问题的思路记录下来,供大家参考!
废话少说,上问题:我linux的版本是2.4.25的,系统跑起来之后:- / # free
- total used free shared buffers
- Mem: 13956 12316 1640 0 0
- Swap: 0 0 0
- Total: 13956 12316 1640
复制代码 通过free命令发现剩余的内存只有:1640k,明显内存不足。刚开始怀疑有可能是缓存内存占用太多:
再次通过:- # cat /proc/meminfo
- total: used: free: shared: buffers: cached:
- Mem: 14290944 12713984 1576960 0 0 1941504
- Swap: 0 0 0
- MemTotal: 13956 kB
- MemFree: 1540 kB
- MemShared: 0 kB
- Buffers: 0 kB
- Cached: 1896 kB
- SwapCached: 0 kB
- Active: 428 kB
- Inactive: 1716 kB
- HighTotal: 0 kB
- HighFree: 0 kB
- LowTotal: 13956 kB
- LowFree: 1540 kB
- SwapTotal: 0 kB
- SwapFree: 0 kB
复制代码 发现并不是由于缓存引起的cache和buffer的值加起来都很小,那么是由于什么问题引起的了?
后来又想到一个命令:/ # ps- PID Uid VmSize Stat Command
- 1 root 304 S init
- 2 root SW [keventd]
- 3 root SWN [ksoftirqd_CPU0]
- 4 root SW [kswapd]
- 5 root SW [bdflush]
- 6 root SW [kupdated]
- 7 root SW [mtdblockd]
- 8 root SWN [jffs2_gcd_mtd2]
- 16 root 160 S telnetd
- 24 root SWN [jffs2_gcd_mtd3]
- 31 root 236 S vsftpd
- 32 root 456 S /bin/ash
- 36 root 304 R ps
- / #
复制代码 统计了一下发现其实应用程序只占用了少量的内存,没有统计出来的都是内核占用的,那么内核占用的为什么统计不出来了?
因为内核共用的是一个mm_struct,这个mm_struct的初始化函数如下:- #define INIT_MM(name) \
- { \
- mm_rb: RB_ROOT, \
- pgd: swapper_pg_dir, \
- mm_users: ATOMIC_INIT(2), \
- mm_count: ATOMIC_INIT(1), \
- mmap_sem: __RWSEM_INITIALIZER(name.mmap_sem), \
- page_table_lock: SPIN_LOCK_UNLOCKED, \
- mmlist: LIST_HEAD_INIT(name.mmlist), \
- }
复制代码 在这个里面根本就没有发现对mm_struct结构体中的:struct vm_area_struct * mmap; /* list of VMAs */这个成员进行初始化
从初始化函数中就可以验证了UTSK书上讲的:struct vm_area_struct * mmap这个结构是面向用户进程的
所以在ps命令中没有关于内核线程占用的虚拟内存的大小。
看来ps命令也没有效果,那么我开始思考:
第一:可以肯定的是内存肯定是被内核占用了!
第二:内核有可能是通过静态的方式占用太多的内存,也就是说定义了太多的静态缓冲区,凭我的直接这种情况应该可能性很小
第三:内核是在初始化的时候通过某种动态的方式不断的申请内存(注意:在我的系统中系统刚起来就占用那么多内存了,我并没有执行任何的应用程序),这个查起来就比较困难了 |
|