loop会导致进程启动时cache的内存大量增长,本来是不需要这么大的,不知道是被cache了多份,还是cache的数据量过大。总之其导致加载到内存的数据量过大,减慢了系统的启动速度。
下面是一个类似的案例。
这个问题在嵌入式技术版我咨询问过,虽然得到了热心回复的兄弟们的帮助,不过还是没有得到有效的答案,所以转到内核版来求助一下,先谢谢大家了:-)
小弟我刚刚接触Linux开发两个月,目前正在从事一款基于Linux的手持多媒体终端样机的开发,我们的样机中使用大容量的Nandflash作为数据存储器,其中一个1.7GB的分区既要作为本机的数据存储器,又要在和PC相连时模拟一个U盘让windows访问,为此我们采用了如下的方法来实现:
1、首先在该Nandflash上使用dd命令创建一个1.7GB的文件disk1,
2、然后每次样机启动后,调用mount -t yaffs2 命令将该分区的Nandflash挂载到/mnt/mtd6上,并且通过File-backed Storage Gadget (FSG)虚拟一个u盘以便和PC相连,即modprobe g_file_storage file=/mnt/mtd6/disk1
3、然后调用
losetup -o 32256 /dev/loop0 /mnt/mtd6/disk1
mount -t vfat /dev/loop0 /media
将disk1和loop0虚拟设备相关联,我们的目的一方面是为了让PC的Windows能够访问这个Nandlflah分区(模拟的一个U盘),并且在PC下所有的些操作其实是对disk1文件的操作,可以保护Nandflash;另一方面则是为了在样机单独使用时也能够访问实际存放在disk1文件中的所有数据内容,否则本机下看见的只是一个disk1文件,而不能够读写其中真正的内容。
使用这样的机制后,我们的目的达到了,但是又出现了一个新的问题,就是在样机单独使用时,如果用内置的播放器软件play存储在使用了loop device虚拟机制的Nandflash区域中(即disk1)的多媒体文件时,使用top命令动态监测的内存使用情况会出现used和cached的数量急速上升,free急剧下降——由于我们的系统中并没有设定swap,所以此处的cached其实就是page cache,直接消耗的物理内存,以致最后只剩下极少的free内存,在播放器进行stop和quit操作的时候速度会慢得无法忍受,常常需要一两分钟才能够退出播放界面或者回到上级菜单。但是同样的情况下如果播放的多媒体文件位于ext2格式的SD卡而不是使用了loop虚拟设备机制的Nandflash时,所有的操作都很正常,top监测到的内存状况也没有发生异常。而在产品开发之初,我们没有要求和PC连接模拟U盘和PC共享Nandflash的时候,没有使用loop虚拟机制,在样机本身上独立的使用播放器播放存储于Nandflash上的多媒体文件时,也一切正常。
我们曾将试过,采用大幅度提高内核的 /proc/sys/vm/min_free_kbytes 的值来保证最低free内存的数量(min_free_kbytes 默认值为1024KB,我们将其提高十倍到102400 KB),这样虽然在使用播放器进行play的时候内存used和cached的数量仍然会暴涨,但是仍然会剩下我们强制所设定的102400 KB的内存,此时再进行stop和quit的速度会明显改观,不过这样的办法并不是治本的方法,而且这样强制将free内存的底线大幅度提高也不知道会不会产生其他不良的影响, 因此我们怀疑是loop device虚拟机制的使用对我们访问该分区的Nandflash造成了这种异常和操作极慢的情况,但是没有找到解决的办法:-(
另外,我在网上曾经看到过可以通过使用 /proc/sys/vm/drop_cache 来回收和限制cache最大值,不过我们所使用的是2.6.11内核,在/proc/sys/vm 下根本就没有drop_cache这一项,而只有诸如swappiness之类的项,但是我们的系统根本就没有swap,这些项完全没有作用:-(
阅读(1656) | 评论(0) | 转发(0) |