关于服务器内存溢出导致宕机的总结项目名:《小兵大战》 欢迎试玩,--传送门--6.26日19:35 事件信息:腾讯云
关于服务器内存溢出导致宕机的总结
项目名:《小兵大战》 欢迎试玩,-->传送门<--
6.26日19:35 事件信息:腾讯云监控-磁盘分区满
手机收到消息,【腾讯云监控-磁盘分区满】|app100630301|19:35|10.190.*.*|磁盘分区0使用90%, 剩余0.7G【腾讯科技】
大区硬件配置:
8核CPU,7G内存,300G硬盘
硬件配置:
硬件 | 型号/版本/配置 | CPU硬件性能相当于 2.0 GHz 的Xeon 处理器或 Opteron 处理器内存硬件性能相当于 DDR3 1066MHz硬盘SATAOSLinux 2.6(suse) / Windows Server 2008gcc4.1.2
跑的都是JAVA应用。
VM_235_195:/home # df -h
文件系统容量已用可用已用%挂载点/dev/sda17.9G6.9G0.7G90%/udev 3.5G 96K3.5G1%/dev/dev/sda37.9G 1.3G 6.3G17% /usr/local/dev/sda4278G2.7G261G2%/data
删除过期的日志和tar.gz压缩包,更改日志的存储路径,从/log/rabbit/ 到/data/log/rabbit,解决问题。
6.26日 20:43 事件信息:跳板机登陆不过去,怀疑整个虚拟机当掉,通过腾讯运维重启解决
2012-06-27 09:37 事件信息: island 和gate 停掉,重启所有应用解决
初步分析1.通过top p pid 查看,进程Gate占用了4G多,单个进程占用达到60%多(总共7G),问题定位到具体的某个进程
2.查看对象的占用 jmap -histo pidjmap -histo:live pid
才100多M
3.查看堆占用jmap -heap pid 才占用几百M
3.查看开心网的服务器,占用达到了12G内存的34%,排除引入TGW时引入的bug
结论,内存泄漏还不在JVM内存占用范围,怀疑是direct memory泄漏,难道netty 有用到和direct memory 相关的东西?
java.lang.OutOfMemoryError: Direct buffer memoryNetty内存泄露另一个项目没有这方面的问题,而用的JDK是1.6.30
4.查看系统日志 cat /var/log/messages |grep -i "killed process"
cat /var/log/messages |grep -i java
Jun 28 13:34:08 VM_235_195 kernel: Out of memory: Killed process pid (java).内存总占用超过系统内存,然后系统杀死进程 ,
在gate 下找hs_err_开头的文件未有找到,搜索 find / -name 'hs_err*' ,依然找不到,放弃。找到情况和 Java Crash分析这里描述的基本类似.
默认配置syslog日志
日 志 文 件
说 明
/var/log/message
系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
/var/log/secure
与安全相关的日志信息
/var/log/maillog
与邮件相关的日志信息
/var/log/cron
与定时任务相关的日志信息
/var/log/spooler
与UUCP和news设备相关的日志信息
/var/log/boot.log
守护进程启动和停止相关的日志消息
5. 检测 DirectMemory 占用 DirectMemorySize.java
编译: VM_235_195:/home/ztgame/tools # javac -classpath $JAVA_HOME/lib/sa-jdi.jar DirectMemorySize.java
执行:VM_235_195:/home/ztgame/tools # java -classpath .:$JAVA_HOME/lib/sa-jdi.jar DirectMemorySize '20591'
Attaching to process ID 20591, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 10.0-b22
NIO direct memory: (in bytes)
reserved size = 7.077148 MB (7420928 bytes)
max size = 200.000000 MB (209715200 bytes)
DirectMemory 占用很低。
pmap -d PID 显示指定程序的内存信息
Address:进程所占的地址空间
Kbytes 该虚拟段的大小
RSS 设备号(主设备:次设备)
Anon 设备的节点号,0表示没有节点与内存相对应
Locked 是否允许swapped
Mode 权限:r=read, w=write, x=execute, s=shared, p=private(copy on write)
Mapping: bash 对应的映像文件名
ps 列出所有java进程
NewSize + PermSize + cms generation used 大概是heap的占用
heap分为: New Generation, (用capacity), CMS generation, (略大于used), Perm Generation(用capacity)
New Generation 和PermGeneration都是预分配了内存,中间可能还没被使用,但是对于操作系统来说,这些内存,算是被使用了。
NewSize = 536870912 (512.0MB)
Perm Generation:
capacity = 75546624 (72.046875MB)
concurrent mark-sweep generation:
used = 442669840 (422.16285705566406MB)
加起来也就1G左右
遗留问题:
direct memory 只有在full gc的时候才回收 ?
每个玩家到底占用多少内存?
堆的内存占用和TOP内存占用关系?