记录一次磁盘IO满负荷性能分析

716 阅读4分钟

Pasted Graphic.png

背景

最近自己购买的服务经常死机,ssh都登录不上去,无奈只能重启解决,但是服务器运行一段时间又会出现这样的情况。自己购买的是阿里的服务器,配置低,只有1G的内存。一开是只能登录阿里云后台,看到磁盘io满负载了,只是任务是不是哪个进出了问题,排查了半天也没有找到,后台通过atop查看任务,慢慢的找到的最终的原因。接下来我简单把解决问题的过程描述一下。

atop

我主要通过atop查找到主要原因的。简单介绍一下Atop。Atop是一个开源的跨平台桌面环境,它可以在Windows、macOS和Linux等操作系统上运行。它是由俄罗斯的开发者Igor Sysoev开发的,最初作为一个fork of Qt Creator for Windows。

Atop的主要特点包括:

1.轻量级:Atop使用轻量级的Xlib库,相对于Qt,减小了大量的安装和启动时间。
2.跨平台:Atop可以在Windows、macOS和Linux等操作系统上运行,支持Windows 10应用商店中的所有应用程序,以及部分Linux发行版。
3.直观的界面设计:Atop采用Qt Designer设计界面,提供了直观的用户界面设计工具,可以帮助开发者快速构建出美观的用户界面。
4.高度可定制:Atop提供了高度可定制的主题和布局选项,开发者可以根据自己的喜好自定义界面。
5.代码可维护性:Atop的开发者社区非常活跃,有大量的贡献,这使得Atop的代码非常容易维护。

Kswapd0

Pasted Graphic.png

这张图是自己服务器磁io满载的时候记录的,可以看到kswapd0这个进程占用尽然达到了97%,然后我就去查了kswapd0相关的资料,整了一下。

Kswapd0 是 Linux 内核中的一个高性能、轻量级的工作进程,主要负责将缓存中的页面刷新到磁盘中。它是由 Linux 内核的工作队列 (Work Queue) 系统调用线程创建的。

Kswapd0 通过调用 swap_page_cache() 系统调用来刷新缓存。swap_page_cache() 系统调用会将指定页面的内容写入到磁盘中,并将该页面从缓存中删除。这个过程可以加快页面的访问速度,因为磁盘访问比内存访问速度更快。

Kswapd0 还会定期地检查交换分区中的空闲页面,并将这些空闲页面加入到页面刷新队列中,以便在需要时进行刷新。

总的来说,Kswapd0 是 Linux 内核中非常重要的一个进程,它负责管理内存和磁盘之间的数据交换,以提高系统的性能和响应速度。如果您想了解更多关于 Kswapd0 的信息,可以查看 Linux 内核源代码中的相关文档。

解决这个方案:

  1. 升级配置,添加内存,升级cpu等
  2. 优化服务

如果想省事,升级配置当然可以解决这些问题,但是这不能解决本质问题,我采取的第二种方案,优化我的服务

优化docker项目

当我再次重启服务器的时候,经过观察发现,在doker项目,mysql这个服务,占用的内存在逐渐升高,达到的400多M,并且不会释放空闲的内存,查找了相关的资料显示,可以修改配置来限制mysql容器的占用大小

进入mysql容器后,进入/etc/mysql/conf.d目录后,编辑docker.cnf文件,添加以下内容

performance_schema_max_table_instances=400  
table_definition_cache=400    #缓存
performance_schema=off    #用于监控MySQL server在一个较低级别的运行过程中的资源消耗、资源东西
table_open_cache=64    #打开表的缓存
innodb_buffer_pool_chunk_size=64M    #InnoDB缓冲池大小调整操作的块大小
innodb_buffer_pool_size=64M    #InnoDB 存储引擎的表数据和索引数据的最大内存缓冲区大小

重启doker容器 经过两天的观察,mysql容器的占用稳定60M左右

image.png

磁盘和cpu占用的对比

image.png

可以很明显看到,已经都降下来,并且这几天都稳定运行。