记一次服务器升级引发的悲剧

前言

内容承接上一篇升级最新技术

上次做了软件一套更新,包括
1. oraclejdk java 8 更新 => openjdk java 11
2. mysql 5.7 更新=> mysql 8.0

最后测试发现,速度确实提升明显,一些原来容易慢的api请求,保守估计至少快了30%~50%。因为有redis缓存,无法做精确统计。

但问题也是随之而来,内存吃不消了。
本来就是一台入门级别配置的老爷机器,又偏偏要跑辣么多的服务,从jdk tomcat 到 mysql redis,还有nginx,现在又多了mongodb和golang。

内存部分长期反复观察后,发现主要的凶手就是java(内存占用约1G 相当于50%),帮凶是mysql(内存占用约500m 相当于25%)。这两个二货在速度提升明显的同时,内存占用也提升的十分明显。具体原理我也不清楚。期间我做了大量的配置调优。
包括:
①. mysql配置优化,具体配置如下,这里面最有效的就是那3个”=400”,原理不清楚,但内存占用一下降低到合理的范围了。

  1. [mysqld]
  2. innodb_buffer_pool_size = 128M
  3. join_buffer_size = 64M
  4. sort_buffer_size = 1M
  5. read_rnd_buffer_size = 1M
  6. # DIY FOR LOW MEM
  7. table_open_cache=400
  8. table_definition_cache=400
  9. performance_schema_max_table_instances=400
  10. datadir=/var/lib/mysql
  11. socket=/var/lib/mysql/mysql.sock
  12. log-error=/var/log/mysqld.log
  13. pid-file=/var/run/mysqld/mysqld.pid
  14. default-time-zone = '+08:00'

②. tomcat优化,主要是2个配置文件,最终效果不太理想,只能说勉强控制到了1G以下
server.xml

  1. <Connector port="8080"
  2. protocol="org.apache.coyote.http11.Http11NioProtocol"
  3. enableLookups="false"
  4. connectionTimeout="30000"
  5. redirectPort="8443"
  6. maxThreads="256"
  7. minSpareThreads="16"
  8. acceptCount="128"
  9. URIEncoding="UTF-8"
  10. maxHttpHeaderSize="20000"
  11. />

catalina.sh

  1. JAVA_OPTS="-Xms256m -Xmx1024m"

③. 增加交换区
这部分代码就不赘述了,方法在之前文章里解释过
Linux Deepin 15.11 手动增加 swap 方法 解决内存不够
说下效果,本身服务器2G内存,默认没有交换区。
这次一口气加了4G的交换区,在内存长时间超过90%的情况下,就会用到交换区,最高交换区占用达到2G。
可以说是拆东墙补西墙的方式暂时防止了内存奔溃导致的系统杀进程的情况出现,但治标不治本。

正文

当然这次的内存危机,肯定不仅仅是版本升级造成的,也包括tcp连接数的提升(代表访问人数增加),以及AP接口和代码量也在增加。
但无论如何日常90%的内存占用,和动不动就有可能奔溃的tomcat,必须要解决。
第一步打算卸载openjdk11和tomcat9,回到最初的oraclejdk8和tomcat8.5。
顺便贴一下tomcat8.5的配置
server.xml

  1. <Connector executor="tomcatThreadPool" port="8080"
  2. protocol="org.apache.coyote.http11.Http11NioProtocol"
  3. connectionTimeout="30000"
  4. maxConnections="10000"
  5. redirectPort="8443"
  6. enableLookups="false"
  7. acceptCount="100"
  8. maxPostSize="10485760"
  9. maxHttpHeaderSize="8192"
  10. disableUploadTimeout="true"
  11. compressionMinSize="2048"
  12. acceptorThreadCount="2"
  13. compression="on"
  14. compressableMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf,image/svg+xml,image/jpeg,image/png,image/gif,audio/mpeg,video/mp4"
  15. URIEncoding="utf-8"
  16. processorCache="10000"
  17. tcpNoDelay="true"
  18. connectionLinger="5"
  19. server="zzzmh's Server"/>

catalina.sh

  1. JAVA_OPTS=”-XX:PermSize=32M s-Xms256m -Xmx1024m -Duser.timezone=GMT+08

后期打算再进一步砍掉mysql8.0 退回mysql5.7

以及最终可能会逐渐抛弃mysql,以mongodb+redis来实现数据持久化。

未完待续

送人玫瑰,手留余香
入门docker笔记之 基本的安装和指令
javascript实现纯前端导入Chrome书签文件并解析