จากการวิเคราะห์ log files ต่างๆ
มีข้อสันนิษฐานว่า จำนวน sessions ที่ client connect เข้ากับ database
มันเกิดค่าที่ตั้งไว้ (ไม่ใช่สาเหตุตรงๆที่ทำให้ล่ม แต่มันทำให้ resources ต่างๆมันไม่พอ)
จากการนับจำนวน user ที่เป็น client ต่อตรง ณ ขณะนั้น
มีจำนวน 262 จอ
นำจำนวน session มาลบออก ก็จะได้เป็นจำนวน connection
ที่ web application ต่อ = 485 - 262 = 218 connection
มาจากไหนวะ ตั้ง 218, connection leak เหรอ
จากการคำนวณแล้ว connection ทั้งหมดที่ web app พึงใช้น่าจะประมาณ 52 connection
ปัญหานี้เคยคิดไว้เหมือนกัน
เลยทำหน้าจอสอบถามใน web app ให้ admin สามารถดูได้ว่า
connection pool size ที่ใช้อยู่ปัจจุบันมีค่าเท่าไร
เปิดเข้าไปดูใน app
ปรากฎว่ามี active อยู่แค่ 5
แล้วมันจะกลายเป็น 218 ได้ไงวะเนี่ย
ผ่านไป 3 วัน
เข้าไปอ่านทบทวน file ~tomcat/conf/context.xml ที่ config Datasource ไว้
<!-- The contents of this file will be loaded for each web application -->
<Context>
<Resource auth="Container"
description="DB
Connection"
driverClass="ca.ingres.jdbc.IngresDriver"
maxPoolSize="21"
minPoolSize="5"
acquireIncrement="5"
name="jdbc/ssoDS"
...
</context>
อ่านบรรทัดแรกปุ๊บ สะดุ้งโหย๋ง
ชิบหาย web application เรามีตั้ง 10 กว่า app
มิน่าเล่า
ค้นหาเอกสาร tomcat ดู
ถ้าอยาก config datasource ให้ share กันระหว่าง context ได้
ต้อง config ไว้ใต้ elememt
GlobalNamingResources
ใน file server.xml
จากการสอบถาม เจ้าตัวผู้เป็นคน config
เขาบอกว่า เดิมก็พยายาม config ไว้ใน GlobalNamingResources เหมือนกัน
แต่ทำแล้วไม่ work สักที ก็เลยย้ายไปลองใส่ไว้ใน context.xml
ซึ่งใส่ปุ๊บก็ work เลย.
เข้าข่าย programming by coincident อีกแล้ว
3 comments:
Programming by Coincidence เย้ยยย...
เป็นบ่อย ถ้าไม่อ่านหนังสือ
แต่บางครั้ง by Coincidence ก็ควรจะมีไว้ติดตัวนะ..หรือเปล่า? (ไว้คราวจำเป็น)
ในระยะสั้น ความสามารถในการเดา ถือเป็นข้อได้เปรียบ
แต่ถ้าเดาเกินหรือไม่ตรงจุดดีนัก, ในระยะยาว มันมีแนวโน้มจะเกิดเป็นปัญหา
อย่างตัวอย่างที่ยกมา อันนี้สั้นหน่อย ใช้มา 1-2 เดือน
ถึงเจอผลกระทบ
ก็จริงครับ
มันสะสม...แล้วตัวเองจะตายเอง...
Post a Comment