记一次feign接口变慢

项目场景:

项目场景:家里测试环境centos7系统上部署了一套java微服务,主要用于研发的代码联调和偶尔的对外演示,请求量非常小。


问题描述

突然有一天,同事向我反馈了一个诡异的问题。每天早上第一次调我的登录接口必超时,之后在掉就好了。如果在隔一段时间不调用我的接口又会出现首次调用超时的情况。

原因分析:

1 常规检查:系统8G内存还有800M的空间,虽然有点少但是应该也没啥问题吧。硬盘空间还有10%应该也还算够用。
2 加日志:第二天早上调用登录问题复现了,主要是feign接口调用特别慢。我开始怀疑feign,这是条不归路,我走了很久很久最后发现方向错了。
3 输出swap的进程最终发现了问题。这可能是一个常识性的问题,奈何本人阅历太浅完全不知道啊。

centos7在内存达到一定上限时为了保证运行更多的进程会做一个swap操作,就是将不常用的内存缓存到硬盘这样会释放出一定的内存用于运行更多的进程。当某个被swap的内存被用到时,系统会将其从硬盘中在回写到内存,这样一来可以保证系统的正常使用,而负作用就是慢。在常规检查中虽然看起来内存还有800M但其实已经透支了。

以下是大佬提供的一个shell脚本,用于查看被swap的进程,以及进程被swap了多少内存。

#!/bin/bash 
# Get current swap usage for all running processes
# Erik Ljungstrom 27/05/2011
# Modified by Mikko Rantalainen 2012-08-09
# Pipe the output to "sort -nk3" to get sorted output
# Modified by Marc Methot 2014-09-18
# removed the need for sudo
 
SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"`
do
    PID=`echo $DIR | cut -d / -f 3`
    PROGNAME=`ps -p $PID -o comm --no-headers`
    for SWAP in `grep VmSwap $DIR/status 2>/dev/null | awk '{ print $2 }'`
    do
        let SUM=$SUM+$SWAP
    done
    if (( $SUM > 0 )); then
        echo "PID=$PID swapped $SUM KB ($PROGNAME)"
    fi
    let OVERALL=$OVERALL+$SUM
    SUM=0
done
echo "Overall swap used: $OVERALL KB"

输出的比较多,我把最关键的拿出来了。果不其然几乎所有java进程被swap了,并且最后一行可以看到一共有将近5个G的内存被swap了。

在这里插入图片描述


解决方案:

最好的办法就是扩内存,但是一个测试服务扩内存估计领导不会同意的。所以只能优化java服务了,启动时将jvm参数设置到最低配,例如加上(-Xmx100m -Xmx100m)。服务都改一遍再次运行大佬的shell脚本
在这里插入图片描述
还是有800M的交换内存,不过已经好很多了。观察了一天,目前没有出现feign调用慢的问题了

最后补充下:

swap策略不是所有的系统都会开启的,可以top下看看Swap的total是不是0,如果有值就证明开启了这个策略。当遇到服务变慢的情况就可以优先看看是不是这里导致的了
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值