
ผมได้พัฒนาระบบตัวหนึ่ง ซึ่งจะต้องรองรับการเปิด Socket จำนวนมาก แล้วก็เจอปัญหาว่า error: [Errno 24] Too many open files เนื่องจากระบบได้จำกัดจำนวนการเปิดไฟล์จำนวนมาก ซึ่งรวมไปถึงการเปิด Socket ด้วยครับ ดังตัวอย่างนี้ครับ
ERROR:tornado.application:Exception in I/O handler for fd 4 Traceback (most recent call last): File "/home/rmutsv/wpad/tornado/ioloop.py", line 672, in start File "/home/rmutsv/wpad/tornado/stack_context.py", line 331, in wrapped File "/home/rmutsv/wpad/tornado/stack_context.py", line 302, in wrapped File "/home/rmutsv/wpad/tornado/netutil.py", line 141, in accept_handler File "/usr/lib/python2.7/socket.py", line 202, in accept error: [Errno 24] Too many open files
โดยเราสามารถไปเพิ่มขีดจำกัดในการเปิดไฟล์ให้เพิ่มขึ้นได้ดังนี้ครับ
1. ตรวจสอบการจำกัดในการเปิดไฟล์
เราสามารถตรวจสอบว่า ขณะนี้ระบบของเรา มีขีดจำกัดในการเปิดไฟล์ไว้เท่าไหร่ ดังคำสั่งต่อไปนี้ครับ
$ ulimit -n 1024
จะเห็นว่าจะมีขีดจำกัดเพียงแค่ 1024 เท่านั้น ทำให้ระบบของเราไม่สามารถรองรับงานในกรณีที่มีการเปิด socket จำนวนที่มากกว่า 1024 ได้ครับ
2. แก้ไขไฟล์ /etc/security/limits.conf
เมื่อเราต้องการเพิ่มขีดจำกัดในการเปิดไฟล์ให้มากขึ้น เพื่อให้ระบบของเรารองรับ socket connection จำนวนมาก ๆ ได้ เราสามารถทำได้โดยไปแก้ไขไฟล์ /etc/security/limits.conf ดังนี้ครับ
File : /etc/security/limits.conf
* soft nofile 50000
* hard nofile 50000
root soft nofile 50000
root hard nofile 50000
จะเห็นว่าเราจะทำการกำหนด limit ในการการเปิดไฟล์ไว้ที่ 50000 ในผู้ใช้ทั้งหมดและ root เนื่องจาก root ไม่ได้รวมใน * ด้วย จึงต้องกำหนดแยกมาอีกชุดนึงครับ จากนั้นก็ทำการ reboot ระบบใหม่ และใช้คำสั่ง ulimit -n ตรวจสอบดูอีกครั้งว่าได้มีการเพิ่มขีดจำกัดแล้ว ก็เป็นอันจบพิธีครับ