服务器经常会出现磁盘 IO 被占满,导致服务器宕机

最近,我的网站经常出现宕机状态,不知道是不是被感染了病毒,希望官方能够及时修复这个 Bug。
同时,我希望官方能够考虑将 clamav 内置于 1Panel 中。

1 个赞

感谢反馈,我们会在后续版本考虑集成 clamav。

现状:当前服务器一直出现内存占用高,导致交换空间磁盘读取被占满。

更新openresty到 1panel/openresty:1.21.4.3-3-2-focal 了吗

已经升级了 @nameless

可以看看是哪些容器占用的内存高,定位一下问题吧

看了一下,是MySQL的容器占用高。

你服务器配置多大啊,mysql本身占用内存就挺多的
MySQL占用内存高可能有多种原因,包括但不限于配置不当、系统资源分配不合理、数据库设计和查询优化不足等。以下是对MySQL占用内存高的问题的详细分析:

  1. 配置不当
  • 缓冲池大小设置不当:innodb_buffer_pool_size是InnoDB存储引擎最重要的配置参数之一,它决定了InnoDB表的数据和索引的缓存大小。如果设置过大,可能会导致系统物理内存不足,从而影响系统性能。
  • 其他缓冲区配置过大:除了InnoDB缓冲池,还有其他缓冲区如key_buffer_size(MyISAM引擎)、query_cache_size(查询缓存)、tmp_table_size(临时表大小)等,如果这些参数设置不合理,也会导致内存占用过高。
  1. 系统资源分配不合理
  • 操作系统缓存:Linux系统会积极地缓存文件系统元数据和其他读取过的数据到内存中,这部分缓存虽然可以被快速释放,但在统计内存使用时会被计入已使用的内存中,从而导致看似较高的内存占用率。
  • 内存碎片:分配和释放内存的过程中可能会产生碎片,导致实际占用的虚拟内存比实际使用的内存要多。
  1. 数据库设计和查询优化不足
  • 低效的SQL查询:复杂或低效的SQL查询可能会导致MySQL创建大量的临时表,从而增加内存使用量。
  • 缺乏索引:缺少合适的索引会导致MySQL在执行查询时需要扫描更多的数据页,这可能会增加对临时表的使用,进而增加内存使用量。
  1. 并发连接数过多
  • 每个连接的内存开销:每个数据库连接都会占用一定的内存,用于存储会话状态、缓存等。如果最大连接数(max_connections)设置过高,而服务器并没有足够的内存来支持这么多并发连接,就会导致内存不足。
  1. 内部结构消耗
  • InnoDB附加内存:除了InnoDB缓冲池之外,InnoDB还有其他内存使用,比如redo log buffer、额外的内存池以及为锁和其他内部结构分配的内存。
  1. 性能架构不合理
  • 硬件资源限制:如果数据库服务器的硬件资源配置较低,尤其是内存容量有限,那么即使数据库优化得很好,也可能因为硬件限制而导致内存使用率高。
  1. 监控和诊断工具不准确
  • 误判:有时候,系统监控工具显示的内存使用率并不完全准确,可能是因为监控工具没有考虑到Linux内核的内存管理机制。

此外,针对上述分析,以下是一些解决MySQL占用内存高问题的建议措施:

  • 仔细审查并调整MySQL的内存相关配置项:确保它们合理且与系统资源匹配。
  • 监控并分析MySQL的实际内存使用情况:使用如SHOW ENGINE INNODB STATUS;和performance_schema来获取更详细的内存使用报告。
  • 考虑调整操作系统的内存管理策略:比如调整THP设置或使用/proc/sys/vm/swappiness来调整内存交换行为。
  • 优化数据库设计和查询:避免低效的SQL查询和过多的临时表使用。
  • 合理设置最大连接数:确保服务器有足够的内存来支持最大连接数。
  • 升级硬件资源:如果应用程序确实需要更多内存来保证性能,可能需要考虑增加服务器物理内存。
1 个赞

内存为2GiB,CPU双核

我已经从 MySQL 8.2 迁移至 MariaDB 10.11 了,感觉 MariaDB 的优化更好。

现在MariaDB的内存被限制在512M了

那就是mysql占用内存多的问题,我觉得你这mysql内存占用是正常的范围,,2G的35%才700M,不多

@王贺 你们什么时候解决内存占用高的问题?我的服务器运行 1Panel 一段时间后,内存从 400 M 飙到将近 1G 以上了,我不得不给它上一个定时自动重启 Docker 服务的脚本以便释放内存空间。

1 个赞

之前也有遇到过相同问题,望修复!谢谢