服务器问题记录

  •  页面请求,不定时无响应

现象:前端页面,有时会打不开;有时个别请求无返回信息;f12 查看请求,提示“no-referrer-when-downgrade”前端

分析过程:java

一、查看请求对应的服务端是否正常(查看服务器日志),发现服务端对于请求能够正常响应;从前端来看,同一个请求,有时有返回信息,有时无返回信息nginx

二、查看nginx access 日志,发现部分请求返回http 499;同一个uri,有返回http 200 和http 499redis

三、查看nginx upstream 配置,发现配置中存在一个无效的服务端地址数据库

结论:缓存

nginx 不会检测upstream 中配置的服务器是否有效,当配置了无效的服务端地址时,请求经过nginx 转发到该无效的服务器时,就会形成请求不可用,nginx 会将该请求的响应封装为 http 499服务器

  • dubbo 提示线程池已满

现象:dubbo 提示线程池已满;前端显示服务不稳定多线程

分析过程:less

一、查看dubbo 服务日志,日志仅显示线程池已满ssh

二、查看服务对应的 error 日志,发现zookeeper 分布式锁有时会释放失败,而后去查看zookeeper 日志,未发现异常

三、阿里云监控报警,数据库CPU 占比超过90%

结论:

查询某列表未使用缓存,致使大量请求(每分钟5W次左右)在短期内访问数据库(自己查询速度没问题,可是请求量太大),形成数据库瓶颈,并对正常的写业务形成影响,大量对于数据库的访问,都在排队,形成响应时间过长,dubbo服务线程池压满

解决方案:

一、按需对查询增长 redis 缓存,JVM 缓存,nginx 缓存

二、对数据库进行读写分离处理,防止下一次大量请求致使的数据库瓶颈问题

  • HttpClient 多线程异常

现象:

java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.

缘由:多线程状态下,公用一个HttpClient对象,一个请求未结束,再次发起新的请求,就会报这个错

解决方法:

一、低版本的HttpClient,可使用 ThreadSafeClientConnManager 来代替 BasicClientConnManager

ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager();
cm.setMaxTotal(20);
HttpClient client = new DefaultHttpClient(cm, httpParams);

二、高版本的HttpClient,可使用 PoolingHttpClientConnectionManager

PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager();
pcm.setMaxTotal(20);
CloseableHttpClient client = HttpClients.custom().setConnectionManager(pcm).build();

  • MySql 存储空间清理

数据文件的清理:使用 truncate table_name 来清理数据量多的表

使用delete 的话,不会释放磁盘空间,须要使用:optimize table tab_name 来释放。

注意:optimize 会锁表,应在空闲时期进行处理

select sum(data_length + index_length + data_free) / 1024 / 1024 from information_schema.tables;

查询数据文件所占空间

  • 挖矿病毒 minerd

解决方案:

挖矿病毒假装为 ntp 进程,但正常的ntp进程名为ntpd

rm -rf /var/spool/cron/crontabs
rm -rf ~/.ssh/KHK75NEOiq
rm -rf /opt/KHK75NEOiq33
rm -rf /opt/*
rm -rf /etc/init.d/ntp
rm -rf /usr/sbin/ntp
rm -rf /usr/local/etc
pkill minerd
kill -9 (/usr/sbin/ntp的进程号)

  • java 进程CPU和内存分析

一、top 命令查看cpu和内存占用较大的进程pid

二、根据进程pid,查看内部线程占用cpu状况

ps -mp 1316 -o THREAD,tid,time | sort -rn | less

(sort -rn 以数值的方式进行逆序排列)

三、找出占用cpu比较高的TID,须要将TID转换为十六进制,例如:printf "%x\n" 1731,结果 6c3

四、使用 jstack 1316 查看具体对应的线程

五、使用 jstat -gcutil 1316 1000 100 查看jvm内存和gc状况

  • zookeeper 数据清理

./bin/zkCleanup.sh -n 50  使用 zookeeper 自带的清理脚本,可清理 log 和 snapshot,-n 50 是指保留50个文件(注意:是log和snapshot各保留50个的意思)

zookeeper 版本在3.4 以上的,也能够在配置中配置自动清理(zoo.cfg):

autopurge.snapRetainCount=50    # 保留50个

autopurge.purgeInterval=72    # 自动清理间隔,单位:小时

相关文章
相关标签/搜索