ฉันพบข้อผิดพลาดนี้เมื่อพยายามเข้าถึงเว็บไซต์ที่ใช้ฐานข้อมูล 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
top
เซิร์ฟเวอร์เพื่อดูว่ากระบวนการเหล่านี้ไม่ว่างหรือไม่ หากเป็นเช่นนั้นฉันคิดว่าการเชื่อมต่อควรหายไปเมื่อการค้นหาเสร็จสิ้น (หรือคุณสามารถฆ่าพวกเขาได้ทันที) หากพวกเขาไม่ได้ใช้งานกำลังและการเชื่อมต่อเป็นมั่นเหมาะตายแล้วผมไม่แน่ใจว่าสิ่งที่เกิดขึ้นหรือวิธีการป้องกันไม่ให้มันครั้งต่อไป ...
waiting
ตั้งค่าสถานะpg_stat_activity
เพื่อดูว่าพวกเขากำลังติดอยู่ในล็อค
SELECT * FROM pg_stat_activity;
ไม่น่าเชื่อถือ - มีคอลัมน์ไม่เพียงพอ คอลัมน์สถานะพูดว่าอะไร นั่นคือฟิลด์ที่สำคัญที่สุดสำหรับคำถามนี้
pg_stat_activity.backend_start
ลองดูที่ การเชื่อมต่อเหล่านี้ถูกสร้างขึ้นก่อนหรือหลังการรีบูตเว็บเซิร์ฟเวอร์หรือไม่ หากพวกเขากำลังเชื่อมต่อใหม่ทั้งหมดฉันคิดว่านั่นหมายความว่าปัญหาอยู่ที่ส่วนท้ายของเว็บเซิร์ฟเวอร์