文档章节

linux 内存耗尽的分析

安静美男子
 安静美男子
发布于 2015/08/10 17:59
字数 970
阅读 7804
收藏 182

在测试NAS性能,用fstest长时间写,分析性能变差的原因,发现server主机内存使用率很高。

1.首先查看内存

# top -M 
 top - 14:43:12 up 14 days, 6 min,  1 user,  load average: 8.36, 8.38, 8.41
 Tasks: 419 total,   1 running, 418 sleeping,   0 stopped,   0 zombie
 Cpu(s):  0.0%us,  0.2%sy,  0.0%ni, 99.0%id,  0.7%wa,  0.0%hi,  0.0%si,  0.0%st
 
Mem:    63.050G total,   62.639G used,  420.973M free,   33.973M buffers
 Swap: 4095.996M total,    0.000k used, 4095.996M free,   48.889G cached
   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                         
   111 root      20   0     0    0    0 S  2.0  0.0   0:25.52 ksoftirqd/11                                                                                                                    
  5968 root      20   0 15352 1372  828 R  2.0  0.0   0:00.01 top                                                                                                                             
 13273 root      20   0     0    0    0 D  2.0  0.0  25:54.02 nfsd                                                                                                                            
 17765 root       0 -20     0    0    0 S  2.0  0.0   0:11.89 kworker/5:1H                                                                                                                    
     1 root      20   0 19416 1436 1136 S  0.0  0.0   0:01.88 init 
 .....


发现内存基本用完,究竟是什么进程占用?top命令发现排名第一的%MEM才零点几。

2.通过 vmstat -m命令查看内核空间的内存使用。

# vmstat -m
 Cache                       Num  Total   Size  Pages
 xfs_dqtrx                     0      0    384     10
 xfs_dquot                     0      0    504      7
 xfs_buf                   91425 213300    384     10
 fstrm_item                    0      0     24    144
 xfs_mru_cache_elem            0      0     32    112
 
xfs_ili                  7564110 8351947    224     17
 xfs_inode                7564205 8484180   1024      4
 xfs_efi_item                257    390    400     10
 xfs_efd_item                237    380    400     10
 xfs_buf_item               1795   2414    232     17
 xfs_log_item_desc           830   1456     32    112
 xfs_trans                   377    490    280     14
 xfs_ifork                     0      0     64     59
 xfs_da_state                  0      0    488      8
 xfs_btree_cur               342    437    208     19
 xfs_bmap_free_item           89    288     24    144
 xfs_log_ticket              717    966    184     21
 xfs_ioend                   726    896    120     32
 rbd_segment_name            109    148    104     37
 rbd_obj_request            1054   1452    176     22
 rbd_img_request            1037   1472    120     32
 ceph_osd_request            548    693    872      9
 ceph_msg_data              1041   1540     48     77
 ceph_msg                   1197   1632    232     17
 nfsd_drc                  19323  33456    112     34
 nfsd4_delegations             0      0    368     10
 nfsd4_stateids              855   1024    120     32
 nfsd4_files                 802   1050    128     30
 nfsd4_lockowners              0      0    384     10
 nfsd4_openowners             15     50    392     10
 rpc_inode_cache              27     30    640      6
 rpc_buffers                   8      8   2048      2
 rpc_tasks                     8     15    256     15
 fib6_nodes                   22     59     64     59
 pte_list_desc                 0      0     32    112
 ext4_groupinfo_4k           722    756    136     28
 ext4_inode_cache           3362   3728    968      4
 ext4_xattr                    0      0     88     44
 ext4_free_data                0      0     64     59
 ext4_allocation_context       0      0    136     28
 ext4_prealloc_space          42     74    104     37
 ext4_system_zone              0      0     40     92
 Cache                       Num  Total   Size  Pages
 ext4_io_end                   0      0     64     59
 ext4_extent_status         1615   5704     40     92
 jbd2_transaction_s           30     30    256     15
 jbd2_inode                  254    539     48     77
 ........


发现这两项值很高: xfs_ili    xfs_inode  占用了大量的内存。

3.使用slabtop命令查看内核slab 缓冲区信息

#slabtop -s c | head
   Active / Total Objects (% used)    : 31807723 / 35664583 (89.2%)
  Active / Total Slabs (% used)      : 3259180 / 3259251 (100.0%)
  Active / Total Caches (% used)     : 139 / 227 (61.2%)
  Active / Total Size (% used)       : 11242773.43K / 12756788.05K (88.1%)
  Minimum / Average / Maximum Object : 0.02K / 0.36K / 4096.00K
   OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
 8480676 7565420  89%    1.00K 2120169        4   
8480676K 
xfs_inode
 8351794 7565375  90%    0.22K 491282       17   
1965128K 
xfs_ili

 

       

xfs_ili 占用1965128k  xfs_inode占用8480676K,但他们究竟是什么东东?猜测是nas/rbd 卷的文件系统缓存信息。xfs_inode看字面意思是xfs文件系统的inode信息。

搜了下xfs_ili,只搜到内核代码片段。

 

 xfs_inode_zone =
1636                 kmem_zone_init_flags(sizeof(xfs_inode_t), "xfs_inode",
1637                         KM_ZONE_HWALIGN | KM_ZONE_RECLAIM | KM_ZONE_SPREAD,
1638                         xfs_fs_inode_init_once);
1639         if (!xfs_inode_zone)
1640                 goto out_destroy_efi_zone;
1641 
1642         xfs_ili_zone =
1643                 kmem_zone_init_flags(sizeof(xfs_inode_log_item_t), "xfs_ili",
1644                                         KM_ZONE_SPREAD, NULL);


 28 typedef struct xfs_inode_log_item {
 29         xfs_log_item_t          ili_item;          /* common portion */
 30         struct xfs_inode        *ili_inode;        /* inode ptr */
 31         xfs_lsn_t               ili_flush_lsn;     /* lsn at last flush */
 32         xfs_lsn_t               ili_last_lsn;      /* lsn at last transaction */
 33         unsigned short          ili_lock_flags;    /* lock flags */
 34         unsigned short          ili_logged;        /* flushed logged data */
 35         unsigned int            ili_last_fields;   /* fields when flushed */
 36         unsigned int            ili_fields;        /* fields to be logged */
 37         struct xfs_bmbt_rec     *ili_extents_buf;  /* array of logged
 38                                                       data exts */
 39         struct xfs_bmbt_rec     *ili_aextents_buf; /* array of logged
 40                                                       attr exts */
 41         xfs_inode_log_format_t  ili_format;        /* logged structure */
 42 } xfs_inode_log_item_t;


 分析加估计是文件系统的日志缓存。究竟是不是?目前nfs-server有14个卷,每个卷的在格式化xfs的时指定的参数(即日志大小)-l=128m    14*128*1024 约等于1965128。

 4.但是xfs_ili xfs_inode两者加起来才10G,还有50G去哪儿了呢?查资料说linux将用过的文件缓存到内存中。

 执行下面的命令就释放了内存

#sync      #
刷到磁盘
 #echo 3 > /proc/sys/vm/drop_caches


5.总结:是不是由于内存少导致的性能变差,还在测试。不过以后在优化nfs-server端有一定的指导意义。卷越多,必然占用的内存越多。做机头的内存配置要高。

 


© 著作权归作者所有

安静美男子
粉丝 18
博文 30
码字总数 18579
作品 0
成都
程序员
私信 提问
加载中

评论(9)

steamer
steamer
这个就是用win和linux的区别了。win里面70%的内存占用就很卡了,但是linux里面的内存基本上都是90%+的,按照设计者的原话就是“内存本来就是要给高速存储用的,为什么还要留空间”,这个跟内核什么的没什么关系。系统默认是100%使用内存的。
安静美男子
安静美男子

引用来自“开源中国首席代码审查官”的评论

引用来自“xto”的评论

也许你应该去调整内核参数来优化,例如 /proc/sys/vm/dirty_background_ratio 等等。而不是粗暴使用sync和drop_caches

同意
谢谢,受教
安静美男子
安静美男子

引用来自“xto”的评论

也许你应该去调整内核参数来优化,例如 /proc/sys/vm/dirty_background_ratio 等等。而不是粗暴使用sync和drop_caches
谢谢,受教
梅林先森
梅林先森

引用来自“xto”的评论

也许你应该去调整内核参数来优化,例如 /proc/sys/vm/dirty_background_ratio 等等。而不是粗暴使用sync和drop_caches

同意
金贞花
金贞花

引用来自“xto”的评论

也许你应该去调整内核参数来优化,例如 /proc/sys/vm/dirty_background_ratio 等等。而不是粗暴使用sync和drop_caches

我去看看
MingjunYang
MingjunYang
fork炸弹,耗尽
x
xto
也许你应该去调整内核参数来优化,例如 /proc/sys/vm/dirty_background_ratio 等等。而不是粗暴使用sync和drop_caches
菲戈
菲戈
48.889G cached可用内存还有很多,缓存了很多文件
读《linux开发工具箱》的一点感想

今天周六,又是清明节,我起床很晚,原因不是我懒,是因为我在被窝里看书了,看的是《linux开发工具箱》,书是老外写的,被翻译成了中文,可以说翻译的很差劲,很多地方感觉不通顺,于是我吭...

晨曦之光
2012/04/10
84
0
浅谈Linux服务器究竟设置多大交换分区合适

年前一客户来电,说他们信息中心机房一台Linux服务器运行缓慢,系统服务出现间歇性停止响应,让过去帮忙处理一下这一问题。 到达现场之后,发现此服务器的物理内存是16G,而最初装机的时候,...

袁跃平
2013/02/19
0
1
hamsterdb 1.1.9 发布,嵌入式数据库

hamsterdb是一个采用C开发,非常快,轻量级的嵌入式数据库引擎。 hamsterdb是一个嵌入式数据库引擎撰写的ANSI - C 。它包括的B +树变长密钥和记录。它支持内存中的数据库和字节独立的文件,数...

红薯
2011/02/19
453
0
Out of memory: Kill process 解决

Linux有一个特性:OOM Killer,一个保护机制,用于避免在内存不足的时候不至于出现严重问题,把一些无关的进程优先杀掉,即在内存严重不足时,系统为了继续运转,内核会挑选一个进程,将其杀...

qianghong000
2018/06/29
0
0
浅谈linux性能优化之二十一:分析邮件系统

邮件应用服务可以允许延迟,没有像web,数据库那样实时性要求强,响应快。对于这种应用在设计上就比较特别,我给出postfix的进程信息: # service type private unpriv chroot wakeup maxpro...

OscerSong
2013/10/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springmvc集成cas,并解决前后端分离情况

1.最近项目需要集成已经存在的cas系统。 但是目前已集成的系统都是jsp。而我们项目是前后端分离开发(伪),没有分开部署。 2.cas原理就不介绍了 网上例子很多。基本都是使用302重定向实现的...

起名字什么的太麻烦了
30分钟前
3
0
HDFS-原理

1. 写操作

叶枫啦啦
今天
2
0
聊聊elasticsearch的MembershipAction

序 本文主要研究一下elasticsearch的MembershipAction MembershipAction elasticsearch-6.7.1/server/src/main/java/org/elasticsearch/discovery/zen/MembershipAction.java public class M......

go4it
今天
3
0
Redis集群

Redis cluster tutorial Redis集群提供一种方式自动将数据分布在多个Redis节点上。 Redis Cluster provides a way to run a Redis installation where data is automatically sharded acros......

OSC首席混子
今天
3
0
AWS codecommit 触发jenkins工作

在gitlab和github上面都有直接发送webhook的配置,但是在AWS上面是没有的直接配置webhook触发jenkins构建的设置的。 通过查看AWS多个service的官方文档,找到了解决方案,方案如下: (1)在c...

守护-创造
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部