我们遇到了一个问题,我们的一台 Linux 机器(Ubuntu 10.04 LTS,在 EC2 上运行,大小是其四倍,RAM 为 68GB,有 8 个虚拟核心,每个核心 3.25GHz)每隔几秒钟就会冻结。输入 ssh 会话会冻结,在正在运行的 Postgresql 进程之一上运行 strace 通常会显示:
02:37:41.567990 semop(7831581, {{3, -1, 0}}, 1
持续几秒钟后才会继续(它总是卡在那个 semop)。
OProfile 显示大部分时间都花在内核上(60%),而 37% 花在 Postgresql 上。
这些暂停(一天前突然开始)的结果是,机器上的负载从 0.7 增加到 10+,并导致我们的整个堆栈运行缓慢。
关于如何追踪正在发生的事情有什么想法吗?iostat 没有显示磁盘特别慢或超载,并且 top 显示每当这些备份发生时用户 CPU 百分比从 8% 飙升到 40% 左右。
答案1
我怀疑你的系统信号量用完了。检查ipcs -l
当前设置。以下是关于调整 postgresql 信号量的一些信息。具体来说,我会尝试增加系统范围内的最大信号量 (SEMMNS) 和每组的最大信号量 (SEMMSL)。您可以使用 来sysctl -p
修改这些设置。
答案2
我们最终将其追溯到 PostgreSQL 的一个设置:“work_mem”,它设置了每个 Postgres 进程在执行排序时需要多少 RAM。我们溢出了(微小的)默认值,这导致系统访问磁盘,这对 EC2 来说是致命的(磁盘活动的突然激增导致内核在 iowait 的快速爆发中冻结)。
答案3
看看这个问题具有 256GB 内存 / 48 个核心的 Linux - 机器开始因剩余大量内存而出现故障/阻塞看看有关 mysql 和大内存交换疯狂的链接是否有帮助。
答案4
考虑到“68GB RAM”,我怀疑这与 VM 效率低下有关。您是否尝试过重新启动 Postgresql 或重新启动?