ปัญหามีไว้ให้แก้จริงๆ ด้วย
Problem
java.io.IOException :: Too many open file
วิเคราะปัญหา
- มีการ access มายังระบบ 400,000 ครั้ง ซึ่งวิเคราะจาก Access Log ของระบบ
- ใช้คำสั่ง lsof [ List of open file ] ใน Linux เพื่อดูว่าแต่ละ process ทำการเปิด file อยู่เท่าไร ดังนี้
>lsof -p
สาเหตุของปัญหาที่อาจจะเกิดขึ้นได้
- มีการเปิด file หรือ IO จำนวนมากที่ OS จะรับได้
การแก้ไขปัญหา
- มีการเปิด file ใน code แต่ไม่ทำการปิด file ???
- มีการแตก process ย่อยจากการใช้คำสั่ง Runtime.getProcess() ซึ่งคุณรูไหมว่า จะมีการเปิด Stream/Pipe ไว้ 3 ช่องทางคือ
stdin, stdout, stderr [ Input, Output, Error ] ดังนั้นควรจะต้องปิดทั้ง 3 ท่อหรือช่องทางไปด้วย เช่น
process.getInputStream().close();
process.getOutputStream().close();
process.getErrorStream().close();
- ในระดับ OS สามารถกำหนด จำนวนสูงสุดในการเปิด file [ เป็นการต่อลมหายใจของระบบเท่านั้น ]
ซึ่งสามารถดูจำนวนได้ด้วยคำสั่ง
>ulimit -a
ดูในส่วนของ open files และสามารถแก้ไขค่าได้
Website Reference
https://support.bea.com/application_content/product_portlets/support_patterns/wls/TooManyOpenFilesPattern.html
Related link from Roti