psql: FATAL: क्षमा करें, बहुत सारे ग्राहक पहले से ही


17

मैं अचानक यह त्रुटि प्राप्त कर रहा हूं जब या तो वेबसाइट का उपयोग करने की कोशिश कर रहा है जो पोस्टग्रैस्कल डेटाबेस का उपयोग करता है, या यहां तक ​​कि जब 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

इससे भी अधिक महत्वपूर्ण यह है कि उन सभी का ग्राहक पता (मेरा वेब सर्वर) समान है।

यह वेब सर्वर 50 के कनेक्शन पूल के साथ रेल पर रूबी का उपयोग कर रहा है। भले ही 50 का कनेक्शन पूल हो, यात्री प्रक्रिया / प्रीफ़ॉर्क एपाचे कॉन्फ़िगरेशन एकल-थ्रेडेड है और इसलिए प्रत्येक प्रक्रिया 50 थ्रेड और 50 डेटाबेस कनेक्शन को स्पॉन नहीं कर सकती है। सिस्टम रिबूट के बाद ऐसा अधिक हुआ है, जिसने सभी उपयोगकर्ताओं को मेरे वेब सर्वर से बाहर कर दिया। संभावना यह है कि डेटाबेस सर्वर पर postgresql वेब सर्वर रिबूट के बारे में पता नहीं है और अभी भी इन प्रश्नों को निष्पादित करने की कोशिश कर रहा है।

क्रेग की टिप्पणियों का जवाब देने के लिए, वेटिंग कॉलम के तहत यह 'एफ' अक्षर को दर्शाता है। ऐसा प्रतीत होता है कि क्वेरी अभी भी निष्पादित हो रही है और अभी तक लॉक जारी नहीं किया गया है। जैसा कि मैंने पहले कहा, यह कितना अजीब है कि अचानक मिली-जुली स्थिति के भीतर मिलीसेकंड के भीतर एक-दूसरे के समान 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। वेब सर्वर रिबूट से पहले या बाद में बनाए गए ये कनेक्शन थे? यदि वे सभी नए कनेक्शन हैं, तो मुझे लगता है कि वेब सर्वर के अंत में समस्या का अर्थ है।
निक बार्नेस

@NickBarnes इन कनेक्शनों में "current_query" कॉलम के तहत समान क्वेरी है और बैकएंड_स्टार्ट समय व्यावहारिक रूप से उन सभी (मिलीसेकंड के अलावा) के लिए समान है। यह वही है जो बहुत अजीब है और मुझे विश्वास है कि अगर स्मृति मुझे सही साबित करती है तो वे रिबूट से पहले थे। लेकिन मैंने मान लिया कि रिबूट कनेक्शन को तोड़ देगा।
जॉनमेरिनो

1
ठीक है ... आपको यह देखने के topलिए सर्वर पर जांच करने की आवश्यकता हो सकती है कि क्या ये प्रक्रियाएं व्यस्त हैं। यदि वे हैं, तो मुझे लगता है कि प्रश्नों के समाप्त होने के बाद कनेक्शन गायब हो जाना चाहिए (या वैकल्पिक रूप से, आप अभी उन्हें मार सकते हैं)। यदि वे बेकार हैं, और कनेक्शन निश्चित रूप से मर चुके हैं, तो मुझे यकीन नहीं है कि क्या हो रहा है, या अगली बार इसे कैसे रोका जाए ...
Nick Barnes

1
waitingझंडे को चेक करें pg_stat_activity, देखें कि क्या वे लॉक पर अटके हुए हैं।
क्रेग रिंगर

1
आपके द्वारा चिपकाया गया उत्पादन SELECT * FROM pg_stat_activity;विश्वसनीय नहीं है - पर्याप्त स्तंभ नहीं हैं। राज्य स्तंभ क्या कहता है? इस प्रश्न के लिए यह सबसे महत्वपूर्ण क्षेत्र है।
एरडमैन

जवाबों:


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 stop

यह तब डेटाबेस में मृत लॉग प्रक्रियाओं को मारता है,

sudo /etc/init.d/postgresql प्रारंभ


6
और फिर अगली बार जब आप एक उत्पादन सर्वर को फिर से रोकते हैं? आपका समाधान स्पष्ट रूप से अटकी हुई प्रक्रियाओं को हटा देता है, लेकिन यह नहीं बताता है कि वे वहां क्यों हैं, न ही एक स्थायी है।
dezso
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.