Displaying articles with tag pconnect

Persistent connection in MySql

Posted by PunNeng, Tue Feb 27 17:38:00 UTC 2007

...บ่นไปที่โพสอันก่อนอยู่แหม็บๆ วันนี้มาพูดถึงเรื่อง persistent connection ใน mysql ละ

ปกติที่เราเขียนติดต่อ mysql กัน เชื่อเหอะ ส่วนใหญ่จะใช้ mysql_connect กันทั้งนั้นแหละ ซึ่งการใช้ฟังก์ชั่นนี้ มันจะ connect เข้า mysql ทุกครั้งที่มีการรันไฟล์ php นั้น ก็คิดดูเอาว่าถ้ามี pageviews ประมาณ 5 พันต่อวัน ก็ต้องมีการ connect เกิดขึ้น 5 พันครั้งต่อวัน เลยทีเดียว

mysql_pconnect() เป็นการสั่งให้ใช้ persistent connection ซึ่งเป็น connection ที่เปิดตลอดเวลา (connect ทีเดียว แล้ว connection นั้นจะค้างไปตลอด) ถ้าเว็บของเรามีคนเข้าตลอดทั้งวันทั้งคืน การใช้ pconnect จะช่วยให้ลดการ connect เข้า mysql ได้โขเลยทีเดียว ซึ่งทำใหเว็บของเราเร็วขึ้นอีก

connection ของ pconnect จะค้างไว้นานเท่าไหร่ ขึ้นอยู่กับการกำหนดค่า wait_timeout ใน mysql ซึ่งปกติจะอยู่ที่ 8 ชั่วโมง (ใครเปิดด้วย connect() แล้วไม่ปิด ระวัง เหอๆ) ถ้าภายใน 8 ชั่วโมง ไม่มีการเรียก pconnect() อีก connection นั้นก็จะถูกปิดไป แต่ถ้าก่อนหน้านั้นมีการเรียก pconnect ก็จะใช้ connection เดิมนั่นแหละ เร็วดี

ของดีแบบนี้ ไม่ใช้ ก็กระไรอยู่ใช่มั้ยครับ

... ฮ่าๆ คิดผิดถนัด อย่าลืมว่า process การ request ของ client เนี่ย จะ handle จาก apache process ซึ่ง apache process จะอยู่นานเท่าไหร่ ขึ้นอยู่กับ timeout ของ apache ด้วย ซึ่งปกติจะอยู่ที่ 300 วินาที พอ apache process มัน timeout ไปแล้ว persistent connection ที่ apache process นั้น handle อยู่ ก็จะเคว้งคว้าง กลายเป็นผีไร้ศาล (ถ้าค้างมากๆ ก็จะเกิน max_connections ซะอีก) แล้ว persistent connection นั้นก็จะค้างเติ่งอยู่จนกว่าจะถึง timeout ของ mysql

ฉะนั้น ทางแก้ก็คือ แก้ wait_timeout ของ mysql ให้ใกล้เคียงกับ apache timeout ด้วย จะได้ไม่มีผีจนล้น server

คำเตือน : shared host ควรดู wait_timeout ของ mysql ก่อนตัดสินใจใช้ pconnect ทุกครั้ง เดี๋ยวจะกลายเป็นว่า pconnect สร้างปัญหามากกว่าเดิม

0 comments | Filed Under: General | Tags: pconnect

codegent: we're hiring