让我从图片开始:

这是我们的备份Tomcat服务器的内存使用情况。 它只是挂在那里,每对夫妇处理简单的健康检查请求,并等待主服务器崩溃带负载。 而且它的内存使用量还在不断增加。 主服务器具有相同的增长内存。 Nagios迟早会开始发送有关内存和交换使用的短信和电子邮件。
两台服务器都运行CentOS 7,内核3.10,Java 1.7和Tomcat 7。
即使当我使用systemctl stop tomcat停止Tomcat服务器时,内存仍然保持使用状态。
只有我发现释放内存的方式是sync && echo 3 > /proc/sys/vm/drop_caches 。 所以,解决方法是把它放在cronjob 。 但我想find一个合适的解决scheme。
我发现这个线程有关类似的问题,它提到设置MALLOC_ARENA_MAX为4(和一些其他线程的build议只是1),我也发现一个线程说它应该与MALLOC_CHECK_环境variables一起工作。 但事实并非如此。 这就是你可以在图表右侧看到的东西。
如果我看广告使用的内存 ,它保持在600 MB左右,并使用非堆内存在70 MB。
你有什么想法可能会导致这一点,以及如何解决这个问题? 我再说一遍,在Tomcat停止后,内存不会被释放,所以我不相信这是在我们的应用程序泄漏。
# free -m total used free shared buffers cached Mem: 64268 4960 59307 64 0 135 -/+ buffers/cache: 4824 59443 Swap: 2047 0 2047 # ps -eo rss | awk '{sum += $1}; END {print sum/1024/1024}' 2.54199
更新从今天早上,在cronjob释放内存的9个小时后:
# free -h total used free shared buffers cached Mem: 62G 13G 48G 80M 0B 77M -/+ buffers/cache: 13G 48G Swap: 2,0G 4K 2,0G # ps -eo vsize | awk '{sum += $1}; END {print sum/1024/1024}' 25.8389 # ps -eo rss | awk '{sum += $1}; END {print sum/1024/1024}' 1.24232 # ps -eo pmem,rss,vsize,args | grep tomcat 1.7 1158608 22684408 java -classpath /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat -Dcatalina.home=/usr/share/tomcat -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat/temp -Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
这变得很奇怪。 运行keepalived它不断发送HTTP请求我们的应用程序的健康检查function通过每隔几秒curl 。 如果我停止keepalived ,内存停止增长。 如果我在同一台机器上从bash无限循环发送相同的curl请求,则内存再次开始增长。 即使我发送请求到URL返回404.如果我在不同的机器启动相同的循环(所以不从本地主机),内存是好的。
# slabtop -o Active / Total Objects (% used) : 244359165 / 244369016 (100,0%) Active / Total Slabs (% used) : 5810996 / 5810996 (100,0%) Active / Total Caches (% used) : 70 / 99 (70,7%) Active / Total Size (% used) : 45770306,72K / 45772288,52K (100,0%) Minimum / Average / Maximum Object : 0,01K / 0,19K / 8,00K OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 243660018 243660018 11% 0,19K 5801429 42 46411432K dentry 143872 141868 98% 0,03K 1124 128 4496K kmalloc-32 118150 118150 100% 0,02K 695 170 2780K fsnotify_event_holder 87040 87040 100% 0,01K 170 512 680K kmalloc-8 80448 79173 98% 0,06K 1257 64 5028K kmalloc-64 56832 56832 100% 0,02K 222 256 888K kmalloc-16 31926 31926 100% 0,08K 626 51 2504K selinux_inode_security 31140 31140 100% 0,11K 865 36 3460K sysfs_dir_cache 15795 14253 90% 0,10K 405 39 1620K buffer_head 15008 14878 99% 1,00K 469 32 15008K xfs_inode 14616 13365 91% 0,19K 348 42 2784K kmalloc-192 11961 11714 97% 0,58K 443 27 7088K inode_cache 10048 9108 90% 0,06K 157 64 628K anon_vma 9664 9480 98% 0,12K 302 32 1208K kmalloc-128 9287 7954 85% 0,21K 251 37 2008K vm_area_struct 8624 8624 100% 0,07K 154 56 616K Acpi-ParseExt 7264 7063 97% 0,25K 227 32 1816K kmalloc-256 5908 5908 100% 0,57K 211 28 3376K radix_tree_node 5304 5304 100% 0,04K 52 102 208K Acpi-Namespace 4620 4620 100% 0,09K 110 42 440K kmalloc-96 3744 3586 95% 1,00K 117 32 3744K kmalloc-1024 3458 3458 100% 0,30K 133 26 1064K nf_conntrack_ffffffff819a29c0 3360 3067 91% 0,50K 105 32 1680K kmalloc-512 3108 3108 100% 0,38K 74 42 1184K blkdev_requests 2975 2975 100% 0,05K 35 85 140K shared_policy_node 2520 2368 93% 0,64K 105 24 1680K proc_inode_cache 1560 1560 100% 0,81K 40 39 1280K task_xstate 1300 1300 100% 0,15K 50 26 200K xfs_ili 1272 1272 100% 0,66K 53 24 848K shmem_inode_cache 1176 1176 100% 1,12K 42 28 1344K signal_cache 1024 1024 100% 2,00K 64 16 2048K kmalloc-2048 975 975 100% 0,62K 39 25 624K sock_inode_cache 900 900 100% 0,44K 25 36 400K scsi_cmd_cache 864 864 100% 0,25K 27 32 216K tw_sock_TCPv6 737 644 87% 2,84K 67 11 2144K task_struct 720 672 93% 2,00K 45 16 1440K TCPv6 704 704 100% 0,18K 16 44 128K xfs_log_ticket 665 665 100% 0,23K 19 35 152K cfq_queue 646 646 100% 0,94K 19 34 608K RAW 640 640 100% 0,39K 16 40 256K xfs_efd_item 624 624 100% 0,10K 16 39 64K blkdev_ioc 624 624 100% 0,20K 16 39 128K xfs_btree_cur 578 578 100% 0,12K 17 34 68K fsnotify_event 555 555 100% 2,06K 37 15 1184K sighand_cache 528 528 100% 0,48K 16 33 256K xfs_da_state 512 512 100% 0,06K 8 64 32K kmem_cache_node 512 512 100% 1,00K 16 32 512K UDP 465 465 100% 2,06K 31 15 992K idr_layer_cache 450 450 100% 0,62K 18 25 288K files_cache
基于slabtop输出,我会说有些东西在某处添加大量的临时文件,然后删除它们。 另一个麻烦的是,某些进程仍然保留文件句柄删除文件,所以文件不会从dentry释放。 由于文件被标记为已删除,所以您不能使用常规的ls和类似的命令find它们。
可能是curl或你正在调用它的脚本。 用lsof -n | grep deleted查看 lsof -n | grep deleted如果有很多删除条目,并从那里追踪罪魁祸首。