世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。
- CPU 100%
这个比较明显,通过top或arthas就可以查看cpu的占用情况,然后找出被占用的线程,进而找出当前线程所运行的方法,分析该方法占用大量cpu的原因如死循环或死锁,即可解决。 - OOM
可以通过两种方式排查,一种是该服务的运行日志,正常情况下会报OOM的异常。另一种是通过 vi /var/log/messages查看系统日志,看有没有因为OOM被kill的情况。 - 内存占用太大
这种情况不太明显,没有任何征兆的被kill掉,我们可能会下意识的认为是设置的内存不够而加大堆内存或非堆内存。其实很有可能是服务本身不需要太多内存,但是如果不加限制,它会申请占用越来越多的内存,当系统监控到服务所占内存太多时,会将其kill掉,这时服务日志不会报错,系统日志也没有记录,所以排查起来就很难了。我的想法是反向思维,启动服务时,给它设置一个较小的内存,如果还被kill,那就继续减小,直到报OOM为止。这样通过逆推的方式查看实际原因。从推理来看,当减小到一个合适的内存时,程序会正常运行,不会再被kill,也不会达到OOM。 - 设置swap分区
在阿里云上出现启动时被kill的情况,也有可能是没有设置swap分区。没错,咱们在正常时是尽量将swap设置为0,但是我看到有些博客上是因为没有设置swap而导致的服务被kill掉,所以如果是使用云的小伙伴遇到这种情况可以设置swap分区试试。