psql: FATAL: ขออภัยมีลูกค้ามากเกินไปแล้ว


16

ฉันพบข้อผิดพลาดนี้เมื่อพยายามเข้าถึงเว็บไซต์ที่ใช้ฐานข้อมูล postgresql หรือแม้กระทั่งเมื่อใช้ยูทิลิตี psql หรือ pgadmin3

ฐานข้อมูลของฉันถูกตั้งค่าให้จัดการ 150 การเชื่อมต่อสูงสุด:

# SHOW max_connections;
 max_connections 
-----------------
 150
(1 row)

หลังจากรีบูตเซิร์ฟเวอร์ ubuntu ที่เว็บไซต์ของฉันเปิดอยู่ (ซึ่งเป็นสิ่งเดียวที่ใช้การเชื่อมต่อ) ฉันเห็นจำนวนการเชื่อมต่อปัจจุบันคือ 140:

# select count(*) from pg_stat_activity;
 count 
-------
   140
(1 row)

ฉันไม่เข้าใจว่าการเชื่อมต่อจำนวนมากอย่างกระทันหันหลังจากรีบูตเซิร์ฟเวอร์ของฉัน ดังนั้นฉันจะตรวจสอบกิจกรรม postgresql:

# SELECT * FROM pg_stat_activity;

และฉันเห็นคอลัมน์มากกว่า 100 คอลัมน์ที่มีข้อความค้นหาที่เหมือนกันซึ่งมีลักษณะดังนี้:

SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1

ที่สำคัญยิ่งกว่านั้นคือพวกเขาทั้งหมดมีที่อยู่ลูกค้าเดียวกัน (เว็บเซิร์ฟเวอร์ของฉัน)

เว็บเซิร์ฟเวอร์นี้ใช้ ruby ​​บนรางที่มีพูลการเชื่อมต่อ 50 แม้ว่าจะมีพูลการเชื่อมต่อ 50 การกำหนดค่ากระบวนการ Passache / prefork apache นั้นเป็นแบบเธรดเดียวดังนั้นแต่ละกระบวนการจึงไม่สามารถวางเธรด 50 เธรดและการเชื่อมต่อฐานข้อมูลได้ 50 มีอะไรเพิ่มเติมเกิดขึ้นหลังจากรีบูตระบบซึ่งทำให้ผู้ใช้ทั้งหมดออกจากเว็บเซิร์ฟเวอร์ของฉัน โอกาสที่ postgresql บนเซิร์ฟเวอร์ฐานข้อมูลจะไม่ทราบว่ามีการรีบูทเว็บเซิร์ฟเวอร์และยังคงพยายามเรียกใช้คิวรีเหล่านี้

เพื่อตอบความคิดเห็นของ Craig ภายใต้คอลัมน์รอมันจะแสดงตัวอักษร 'f' ปรากฏว่าแบบสอบถามยังคงดำเนินการอยู่และยังไม่ได้ปล่อยการล็อก ตามที่ฉันได้กล่าวไปแล้วสิ่งที่แปลกมากคือทันใดนั้นมีการค้นหามากกว่า 100 ครั้งที่เหมือนกันในไม่กี่มิลลิวินาทีในทันทีที่ปรากฏในสถานะการดำเนินการนี้ นั่นเป็นปริศนาสำหรับฉัน:

mydb=# SELECT * FROM pg_stat_activity;

 datid  | datname  | procpid | usesysid | usename |                                                                           current_query                                                                           | waiting |          xact_start           |          query_start          |         backend_start         |  client_addr   | client_port
--------+----------+---------+----------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+-------------------------------+-------------------------------+-------------------------------+----------------+-------------
 464875 | mydb     |    4992 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:48.437081-04 | 2014-06-28 22:46:48.437081-04 | 2014-06-28 22:46:44.089764-04 | 192.111.11.111 |       37166
 464875 | mydb     |    4993 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:48.497764-04 | 2014-06-28 22:46:48.497764-04 | 2014-06-28 22:46:44.277856-04 | 192.111.11.111 |       37167
 464875 | mydb     |    4994 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:48.504425-04 | 2014-06-28 22:46:48.504425-04 | 2014-06-28 22:46:44.485269-04 | 192.111.11.111 |       37168
 464875 | mydb     |    4996 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:48.482695-04 | 2014-06-28 22:46:48.482695-04 | 2014-06-28 22:46:44.688203-04 | 192.111.11.111 |       37169
 464875 | mydb     |    4998 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:48.432836-04 | 2014-06-28 22:46:48.432836-04 | 2014-06-28 22:46:44.703883-04 | 192.111.11.111 |       37170

-- many more

 464875 | mydb     |    5052 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:59.584386-04 | 2014-06-28 22:46:59.584386-04 | 2014-06-28 22:46:51.85682-04  | 192.111.11.111 |       37360
 464875 | mydb     |    5053 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:59.506483-04 | 2014-06-28 22:46:59.506483-04 | 2014-06-28 22:46:52.083316-04 | 192.111.11.111 |       37367
 464875 | mydb     |    8958 |    16387 | myuser | <IDLE>                                                                                                                                                            | f       |                               | 2014-06-29 00:05:06.735249-04 | 2014-06-27 16:34:39.307312-04 | 192.111.11.111 |       52759
 464875 | mydb     |    5054 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:59.52573-04  | 2014-06-28 22:46:59.52573-04  | 2014-06-28 22:46:52.285867-04 | 192.111.11.111 |       37371
 464875 | mydb     |    5055 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:59.530804-04 | 2014-06-28 22:46:59.530804-04 | 2014-06-28 22:46:52.303562-04 | 192.111.11.111 |       37372
 464875 | mydb     |    5056 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:59.572198-04 | 2014-06-28 22:46:59.572198-04 | 2014-06-28 22:46:52.31447-04  | 192.111.11.111 |       37373
 464875 | mydb     |    5057 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:59.872037-04 | 2014-06-28 22:46:59.872037-04 | 2014-06-28 22:46:52.323721-04 | 192.111.11.111 |       37374
 464875 | mydb     |    5058 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:59.961803-04 | 2014-06-28 22:46:59.961803-04 | 2014-06-28 22:46:52.334238-04 | 192.111.11.111 |       37375
 464875 | mydb     |    5059 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:59.53713-04  | 2014-06-28 22:46:59.53713-04  | 2014-06-28 22:46:52.347227-04 | 192.111.11.111 |       37376
 464875 | mydb     |    5060 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:47:00.208948-04 | 2014-06-28 22:47:00.208948-04 | 2014-06-28 22:46:52.360008-04 | 192.111.11.111 |       37377
 464875 | mydb     |    5061 |    16387 | myuser | SELECT  "reports".* FROM "reports"  WHERE (("reports"."time" < '2014-06-28 13:30:42.000000' AND "reports"."unit_id" = 3192)) ORDER BY "reports"."id" DESC LIMIT 1 | f       | 2014-06-28 22:46:59.938983-04 | 2014-06-28 22:46:59.938983-04 | 2014-06-28 22:46:52.369496-04 | 192.111.11.111 |       37378

pg_stat_activity.backend_startลองดูที่ การเชื่อมต่อเหล่านี้ถูกสร้างขึ้นก่อนหรือหลังการรีบูตเว็บเซิร์ฟเวอร์หรือไม่ หากพวกเขากำลังเชื่อมต่อใหม่ทั้งหมดฉันคิดว่านั่นหมายความว่าปัญหาอยู่ที่ส่วนท้ายของเว็บเซิร์ฟเวอร์
Nick Barnes

@NickBarnes การเชื่อมต่อเหล่านี้ทั้งหมดมีแบบสอบถามเดียวกันภายใต้คอลัมน์ "current_query" และเวลาแบ็กเอนด์ _ เริ่มต้นจะเหมือนกันสำหรับพวกเขาทั้งหมด (มิลลิวินาที) นั่นคือสิ่งที่แปลกมากและฉันเชื่อว่าหน่วยความจำให้บริการฉันถูกต้องพวกเขาทั้งหมดก่อนรีบูต แต่ฉันคิดว่าการรีบูตจะทำให้การเชื่อมต่อหยุดชะงัก
JohnMerlino

1
ตกลง ... คุณอาจต้องตรวจสอบtopเซิร์ฟเวอร์เพื่อดูว่ากระบวนการเหล่านี้ไม่ว่างหรือไม่ หากเป็นเช่นนั้นฉันคิดว่าการเชื่อมต่อควรหายไปเมื่อการค้นหาเสร็จสิ้น (หรือคุณสามารถฆ่าพวกเขาได้ทันที) หากพวกเขาไม่ได้ใช้งานกำลังและการเชื่อมต่อเป็นมั่นเหมาะตายแล้วผมไม่แน่ใจว่าสิ่งที่เกิดขึ้นหรือวิธีการป้องกันไม่ให้มันครั้งต่อไป ...
นิคบาร์นส์

1
ตรวจสอบการwaitingตั้งค่าสถานะpg_stat_activityเพื่อดูว่าพวกเขากำลังติดอยู่ในล็อค
Craig Ringer

1
ผลลัพธ์ที่คุณวางจากSELECT * FROM pg_stat_activity;ไม่น่าเชื่อถือ - มีคอลัมน์ไม่เพียงพอ คอลัมน์สถานะพูดว่าอะไร นั่นคือฟิลด์ที่สำคัญที่สุดสำหรับคำถามนี้
eradman

คำตอบ:


5

นี่น่าจะเป็นปัญหาเฉพาะของการเขียนโปรแกรมไคลเอนต์ คุณจะไม่สามารถแก้ไขได้โดยเพิ่มพารามิเตอร์ "max_connections"

ฉันพบปัญหาที่เกี่ยวข้องที่เป็นไปได้: การรวมการเชื่อมต่อฐานข้อมูลทับทิม

แม้ว่าคุณสามารถทำการดีบักฝั่งเซิร์ฟเวอร์เพิ่มเติมได้อีก:

เปิดใช้งาน "log_connections" และ "log_disconnections" ใช้ "log_line_prefix" ด้วย "% m% a% p" ด้วย

แอปพลิเคชั่นที่มีประโยชน์มากสำหรับการดีบักเซิร์ฟเวอร์ PostgreSQL นั้นเป็นpowaหรือมากกว่านั้นเช่น: pg_activity

สำหรับการดีบักเซิร์ฟเวอร์เรียลไทม์ฉันชอบpg_activity - โดยเฉพาะอย่างยิ่งกับคุณสมบัติในการแสดงบล็อคและฆ่าเซสชัน


-4

นี่เป็นวิธีที่ดีที่สุดในการแก้ปัญหา ... ใช้งานได้

ล็อกอินเข้าสู่เซิร์ฟเวอร์โดยใช้ผงสำหรับอุดรู SSH

sudo /etc/init.d/postgresql หยุด

สิ่งนี้จะฆ่ากระบวนการบันทึกที่ไม่ทำงานในฐานข้อมูลแล้ว

sudo /etc/init.d/postgresql เริ่มต้น


6
และครั้งต่อไปที่คุณหยุดเซิร์ฟเวอร์ที่ใช้งานจริงอีกครั้ง วิธีการแก้ปัญหาของคุณจะลบกระบวนการที่ติดอยู่ออกอย่างชัดเจน แต่ไม่ได้อธิบายว่าทำไมพวกเขาถึงอยู่ที่นั่นและไม่ยั่งยืน
dezso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.