Django: CONN_MAX_AGE ยังคงมีการเชื่อมต่อ แต่จะไม่นำมาใช้ซ้ำกับ PostgreSQL


17

ฉันได้ติดตั้ง django กำลังใช้ Django 1.6.7 และ Postgres 9.3 บน Ubuntu 14.04 LTS

ไซต์จะได้รับการเชื่อมต่อไปยังฐานข้อมูล PostgreSQL พร้อมกันประมาณ ~ 250 ซึ่งเป็น Quad Core Xeon E5-2670 ที่ 2.5GHz และ RAM ขนาด 16GB ค่าเฉลี่ยการโหลดของเครื่องนั้นตลอดทั้งวันอยู่ที่ประมาณ 20 ถึง 30

ในบางครั้งฉันจะได้รับอีเมลเกี่ยวกับการเชื่อมต่อหมดเวลาไปยังฐานข้อมูลและฉันคิดว่าการเปิดใช้งานการรวมการเชื่อมต่อบางประเภทจะช่วยบรรเทาปัญหานี้รวมถึงลดภาระของฐานข้อมูลลงเล็กน้อย

เนื่องจากเราใช้ Django 1.6 เราจึงมีการรวมกำไรในตัวสำหรับเรา อย่างไรก็ตามเมื่อฉันตั้งค่า CONN_MAX_AGE เป็น 10 วินาทีหรือ 60 วินาทีเกือบจะทันทีจำนวนการเชื่อมต่อพร้อมกันก็ข้ามไปที่การตั้งค่าสูงสุดที่อนุญาต

ดังนั้นจึงปรากฏเหตุผลสำหรับสิ่งที่เคยเชื่อมต่อกำลัง persisting แต่พวกเขาไม่ได้มีการถูกนำมาใช้ใหม่

อะไรคือสาเหตุของสิ่งนี้

PS นอกจากนี้เรายังใช้ gunicorn กับ --worker-class = eventlet บางทีนี่อาจเป็นที่มาของความทุกข์ของเรา?

คำตอบ:


18

เมื่อทำการทดลองเพิ่มเติมฉันพบว่าสาเหตุของปัญหาของเราคือระดับผู้ปฏิบัติงานเหตุการณ์ของ gunicorn microthread แต่ละอันทำให้เกิดการเชื่อมต่อแบบถาวรและไม่มีทางที่จะนำกลับมาใช้ใหม่ได้

การปิดใช้งาน eventlet ทำให้ภาระในเว็บเซิร์ฟเวอร์ของเราเพิ่มขึ้น (แต่ไม่มากนัก) แต่ตอนนี้โหลด postgres ลดลงเหลือเฉลี่ย 3 จาก 30


2
คุณเพิ่งช่วยพวกเราได้สักพักหนึ่งครั้ง! เราสังเกตพฤติกรรมที่เหมือนกันทั้งหมดและเรากำลังใช้ eventlet จะพยายามเปลี่ยนไปใช้การรวมการเชื่อมต่อและดูว่ามันทำงานอย่างไร
silentser

3
ปรับปรุง: เชื่อมต่อฐานข้อมูลร่วมกันกับ pgBouncer ดูเหมือนจะแก้ปัญหาได้ (เรายังคงใช้ eventlet)
silentser

เห็นได้ชัดว่ายังมีที่ psycogreen: pypi.python.org/pypi/psycogreen/1.0 (ฉันไม่ได้พยายามมันเป็นครั้งเดียวที่ผมตั้ง CONN_MAX_AGE ให้เป็นศูนย์ก็จะใช้เวลา 20ms ระบบของเราที่จะทำให้การเชื่อมต่อฐานข้อมูลเพื่อให้เราก็ไม่จำเป็นต้องร่วมกัน)
Darren

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