一次内存不足导致的程序频繁宕机——top命令详解

top详解

  • 之前对于部署程序的经验就是java -jar xxx.jar & ,然后配下nginx就完事了。这次自己部署这个网站,用的配置是1core2gb的服务器,部署上去后发现经常隔段时间就宕机,我以为是程序问题,但是日志也没有记录到error级别的错误,这就很郁闷了,加上我平时自己跑笔记本上基本没遇到过宕机的情况,这就更让我疑惑了。所以决定好好研究一番

  • 首先是top

    如图,发现列表并没有我想要的java或者mysql占用的情况,这不太可能!但是偶尔能看到java弹了出来,马上就不见了,这不科学,百度了下,原来按下大写M,就能出来了,什么原理,其实就是按程序占用大小排序而已,这个时候我们能看到了
    微信图片_20200615154253.png

    • pid:进程id
    • USER:用户
    • PR:优先级
    • NI:nice值。负值表示高优先级,正值表示低优先级
    • VIRT:进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    • RES:进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    • SHR:共享内存大小,单位kb

    所以大概也能看到了,java和Mysql占用大概35%,那么还剩下70m的free空闲内存,所以很有可能就是剩下的空闲内存太小了,然后我看到buffer/cache竟然占用了800多m。

    • 什么是buffer/cache?

    buffer和cache是两个在计算机技术中被用滥的名词,放在不通语境下会有不同的意义。在Linux的内存管理中,这里的buffer指Linux内存的:Buffer cache。这里的cache指Linux内存中的:Page cache。翻译成中文可以叫做缓冲区缓存和页面缓存。在历史上,它们一个(buffer)被用来当成对io设备写的缓存,而另一个(cache)被用来当作对io设备的读缓存,这里的io设备,主要指的是块设备文件和文件系统上的普通文件。但是现在,它们的意义已经不一样了。在当前的内核中,page cache顾名思义就是针对内存页的缓存,说白了就是,如果有内存是以page进行分配管理的,都可以使用page cache作为其缓存来管理使用。当然,不是所有的内存都是以页(page)进行管理的,也有很多是针对块(block)进行管理的,这部分内存使用如果要用到cache功能,则都集中到buffer cache中来使用。(从这个角度出发,是不是buffer cache改名叫做block cache更好?)然而,也不是所有块(block)都有固定长度,系统上块的长度主要是根据所使用的块设备决定的,而页长度在X86上无论是32位还是64位都是4k。

    • 如何回收cache?

    Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放cache,作为free空间分给相关进程使用。所以一般情况下,我们认为buffer/cache空间可以被释放,这个理解是正确的。
    但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。所以伴随着cache清除的行为的,一般都是系统IO飙高。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。

    • 所以最后我决定手动释放掉
    echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
    echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
    echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。
    

    我选择了第三种。
    最后问题也解决了,目前来看系统稳定流畅运行

# linux 

评论

渣男 : 456
三群的弟弟 : 123
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×