上线了很久的一个项目(财政数据共享平台),由于领导要求,新来的同事就把新项目(社保数据共享)做在了该项目上,这就导致了许多的问题,先从日志说起,该同事把数据获取和传送都打印出来,导致打的日志实在太多,每过一两天,就导致日志超过1个G。我们都知道,别说一个G,就是超过几百兆的日志文件,vi都比较慢,更别说搜索查找了,所以昨儿写了一个脚本,按天备份和压缩日志,而且上线了调整后的日志打印,这事处理完了,就该说说正事了。
该项目采用定时任务的方式取数发数,一共配置了六个自动任务(spring+quartz),但是24号一整天,有一个自动任务莫名奇妙地未启动(检查了日志和访问记录,确定该自动任务未启动),但是查了23日的日志记录,该自动任务是启动的。该自动任务配置时间是17、20、23点整启动,查了其他自动任务,24号这一天也是启动的,也就是说,某一个自动任务莫名奇妙地到点未启,那么,我的猜测就是很有可能就是线程池满了。
查看Linux物理内存命令:
cat /proc/cpuinfo
cat /proc/meminfo
free (free -m或free -g)
这是在测试环境的模拟结果,可以很明细地看到物理内存不足,清空日志,删掉一些不必要文件,执行free -m查看:
然后我们修改tomcat设置内存大小防止服务器OOM,在tomcat的bin目录下修改catalina.sh文件,在cygwin=false之前添加:
JAVA_OPTS="-Xms512m -Xmx1024m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m"
-Xms:表示Java初始化堆的大小,建议-Xms与-Xmx设成一样的值,避免JVM 反复重新申请内存,导致性能大起大落,默认值为物理内存的 1/64,默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40% 时,JVM就会增大堆直到-Xmx的最大限制。-Xmx:表示最大Java 堆大小,当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃,因此一般建议堆的最大值设置为可用内存的最大值的80%。如何知道我的JVM能够使用最大值,使用java -Xmx512M -version 命令来进行测试,然后逐渐的增大512 的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息,默认值为物理内存的 1/4,默认(MinHeapFreeRatio参数可以调整)空余堆内存大于 70% 时,JVM 会减少堆直到-Xms 的最小限制。-Xss:表示每个Java线程堆栈大小,JDK5以后每个线程堆栈大小为1M,以前每个线程堆栈大小为 256K。根据应用的线程所需内存大小进行调整,在相同物理内存下,减小这个值能生成更多的线程,但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用, 如果栈不是很深, 应该是128k够用的,大的应用建议使用256k或512K,一般不易设置超过1M,要不然容易出现out ofmemory。这个选项对性能影响比较大,需要严格的测试。-XX:NewSize:设置新生代内存大小。-XX:MaxNewSize:设置最大新生代新生代内存大小-XX:PermSize:设置持久代内存大小-XX:MaxPermSize:设置最大值持久代内存大小,永久代不属于堆内存,堆内存只包含新生代和老年代。
调整完内存,我们就该调整一下线程池了,进入Tomcat的conf目录,打开server.xml,可以看到线程池配置被注释了,那么,我们调整一下:
maxThreads="1000" 最大并发数
minSpareThreads="100"///初始化时创建的线程数
maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
acceptCount="700"// 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理