我有一台服务器,在一天中的随机时间突然达到 4 到 6 之间的平均负载峰值,但无法确定原因。大多数时候,平均负载会在 1.5 到 2 之间徘徊,然后突然跳到 4 或 6,然后又回落。我运行着 mariadb 和 apache 进程,但当我检查我的 apache 以查看流量是否有任何跳跃时,它看起来与 mariadb 处理的查询量大致相同。
这是顶部:
顶部 - 23:58:16 启动 2 天,7:05,1 个用户,平均负载:3.64、3.07、2.93 任务:总计 290 个,其中 1 个正在运行,289 个正在休眠,0 个已停止,0 个僵尸 %Cpu:18.5 us、10.8 sy、0.0 ni、70.3 id、0.0 wa、0.0 hi、0.4 si、0.0 st KiB 内存:总计 13174942,空闲 11137099,已使用 3200604,缓冲/缓存 17177824 KiB 交换:总计 4190204,可用 4190204,已使用 0。12759236+可用内存 PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令 934 mysql 20 0 8965860 1.360g 9376 S 353.8 1.1 4240:34 mysqld 9 根 20 0 0 0 0 S 0.3 0.0 5:48.98 rcu_sched 43 根 20 0 0 0 0 S 0.3 0.0 0:04.45 ksoftirqd/7 798 root 20 0 24192 1700 1380 S 0.3 0.0 0:09.10 systemd-logind 17627 阿帕奇 20 0 586792 22372 8652 S 0.3 0.0 0:00.61 httpd 24715 根 20 0 0 0 0 S 0.3 0.0 0:04.30 kworker/u24:0 1 根 20 0 191404 4356 2404 S 0.0 0.0 0:20.04 systemd 2 根 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 3 根 20 0 0 0 0 S 0.0 0.0 0:00.80 ksoftirqd/0 5 根 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root rt 0 0 0 0 S 0.0 0.0 0:00.17 迁移/0
更多细节:
- MariaDB 进行大量的读取和写入,每小时接收和发送的流量大约为 2 GiB。
- 查询统计数据显示 SELECTS 约占 55%,UPDATES 约占 27%。在切换到 INNODB 等其他引擎之前,我想确保是我的数据库服务器导致了峰值。
- 内存看起来很充足。
总计已用免费共享 buff/缓存可用 内存:128661 3534 104646 88 20480 124164 交换:4091 0 4091
- iotop 显示以下内容,我在 Raid 1 上有一个 SSD。
总磁盘读取速度:0.00 B/s | 总磁盘写入速度:1574.60 K/s 实际磁盘读取:0.00 B/s | 实际磁盘写入:0.00 B/s
- 我的整个数据库大小实际上只有 250MB 左右。
这似乎是 CPU 限制的问题,因为我仍然有足够的 RAM,而 SSD 的读写速度还没有达到接近它的水平。我怀疑我正在 MyISAM 引擎上运行我的整个数据库表,我看到很多“等待表级锁”的情况,但同时我觉得读写在一天中都是一致的,所以我不确定为什么它会突然飙升。另外,似乎投入更多内存或 SSD 不会有帮助,因为它几乎不使用任何内存或 SSD。也许我的 MariaDB 配置不好?
答案1
- 尝试使用常规查询日志来查看是否有任何 cron 进程或其他查询https://mariadb.com/kb/en/mariadb/general-query-log/
- 可以使用 Monit、newrelic 或 datadog 等工具来确认哪些东西正在使用您的 CPU、使用了多少以及何时使用