我目前真的在为一个性能问题而苦苦挣扎,当我的数据库服务器处于“重”负载时,我所有的数据库查询比平时多花费 1000 倍。
我有一台运行 ubuntu 12.04 并托管我的 postgresql 9.2 数据库的服务器。服务器在 Hetzner.de 上,它是 EX6s(8 核氙气,32Gb ram 和两个 3T HDD,在使用 ubuntus 软件 raid 的 RAID1 设置中)。当我运行大量查询(我经常在晚上完成)时,我发现几乎所有 CPU 使用量都花在了 CPU I/O 等待上。我安装了新的遗物监控,我似乎找不到任何其他迹象表明可能是这种 CPU I/O 等待的根本原因,这显然是我的性能和吞吐量的瓶颈。
所以问题是,这个 CPU I/O 等待是什么,它在等待什么?
我添加了所有我可以从下面的新遗物中获得的概览图表。我在看什么?一定有明显的瓶颈吧?我应该在哪里潜水?
数据库服务器 CPU 使用率 - 告诉我有问题的邪恶者 https://rpm.newrelic.com/public/charts/cEdIvvoQZCr
数据库服务器平均负载 https://rpm.newrelic.com/public/charts/cMNdrYW51QJ
数据库服务器物理内存 https://rpm.newrelic.com/public/charts/c3dZBntNpa1
数据库服务器磁盘 I/O 使用 - 如您所见,磁盘似乎没有被充分利用(几乎没有) https://rpm.newrelic.com/public/charts/9YEVw6RekFG
数据库服务器网络 I/O (Mb/s) - 该网络是一个千兆内部网络,所有通信都在其上进行。 https://rpm.newrelic.com/public/charts/lKiZ0Szmwe7
按挂钟时间排名前 5 位的数据库操作 https://rpm.newrelic.com/public/charts/dCt45YH12FK
数据库吞吐量 https://rpm.newrelic.com/public/charts/bIbtQ1mDzMI
数据库响应时间 https://rpm.newrelic.com/public/charts/fPcNL8WA6xx
更新:
做完之后,sudo iostat -k 1
我开始怀疑了。我得到了很多这样的输出,这是我在 NR 中看不到的:
Device: tps kB_read/s kB_wrtn/s …
Run Code Online (Sandbox Code Playgroud) 在 Redis 文档中,它明确指出vm.overcommit_memory
应设置1
为确保后台保存更新失败:http://redis.io/topics/faq
然而
在 postgresql 文档中,它说,vm.overcommit_memory
应该设置2
为避免 post master 进程不会被 oom 杀手杀死:http://www.postgresql.org/docs/9.3/static/kernel-resources.html
现在看来,这是自相矛盾的。我应该怎么办?
我的 redis 数据库的限制为 20GB。服务器拥有 252GB 物理 RAM。Postgresql 很少使用超过 100GB 的物理内存。
PS:我使用的是 ubuntu 14、Redis 3.0 和 Postgresql 9.3
设置 我有一堆 t2.small EC2 实例运行托管称为thumbor的图像处理库,用于简单的动态图像大小调整。原件从 S3 加载。在实例前面我有一个 EC 负载均衡器。我在服务器中安装了 New Relic 服务器监控。
问题 在随机时间,我的服务器突然开始体验极高的平均。响应时间。如果我查看 New Relic 中的统计数据,我唯一看到的是服务器 CPU 持续飙升,报告“被盗”的 CPU。
我的服务器似乎有足够高的容量,同时吞吐量并没有出现任何极端峰值。
我注意到,如果我再次停止/启动服务器。然后被盗的 CPU 消失了,它们再次运行良好 - 直到下一次 - 可能需要数小时或数天。
为什么会发生这种情况,我该怎么办?