FreeBSD:“ มีไฟล์ที่เปิดมากเกินไป” แต่น่าจะเปิดได้อีก 160,000 ไฟล์


11

ฉันมีระบบ FreeBSD 8 ที่รัน ZFS พร้อมกับเซิร์ฟเวอร์ MySQL 5.5 ซึ่งประมาณ 355GB และคาดว่าจะเติบโตเป็นเทราไบต์สองสามตัว

MySQL เรียกข้อผิดพลาดเกี่ยวกับ "ไฟล์ที่เปิดมากเกินไป" /etc/hosts.allowบน เราไม่ได้ใช้อย่างชัดแจ้ง/etc/hosts.allowแต่ใช้โดยhosts_access (3) ( libwrap.a) ซึ่งใช้โดยหลายสิ่ง

mysqld[1234]: warning: /etc/hosts.allow, line 15: cannot open /etc/hosts.allow: Too many open files

แต่เมื่อฉันตรวจสอบ 'ดูเหมือนจะตีขีด จำกัด ใด ๆ ที่เกิดขึ้นจริง จำนวนไฟล์ที่เปิดอยู่ที่รายงานkern.openfiles staysต่ำกว่า 40,000 ในช่วงระยะเวลาที่ยั่งยืนและข้อ จำกัด ของเรานั้นสูงกว่ามาก:

# sysctl -a |grep files
kern.maxfiles: 204800
kern.maxfilesperproc: 184320
kern.openfiles: 38191

# ulimit -n
184320

Openfiles ควรถูกตั้งค่าเป็นไม่ จำกัด :

# grep openfiles /etc/login.conf
    :openfiles=unlimited:\

MySQL บอกว่าควรจะสามารถเปิดตัวจัดการไฟล์ 184320 ได้:

# mysqladmin variables | grep open_files_limit
| open_files_limit                              |     184320                |

และข้อมูลบางอย่างจากมุมมองของผู้ใช้ MySQL ฉันหยุด mysql และแฮ็ก/usr/local/etc/rc.d/mysql-serverเพื่อพิมพ์ตัวแปรเหล่านี้ดังนั้นสิ่งนี้ควรเป็นตัวแทนของสภาพแวดล้อม MySQL โปรดทราบว่าหมายเลข 184320 สอดคล้องกับข้างต้น

# /usr/local/etc/rc.d/mysql-server.stefantest start
Starting mysql.
cpu time               (seconds, -t)  unlimited
file size           (512-blocks, -f)  unlimited
data seg size           (kbytes, -d)  33554432
stack size              (kbytes, -s)  524288
core file size      (512-blocks, -c)  unlimited
max memory size         (kbytes, -m)  unlimited
locked memory           (kbytes, -l)  unlimited
max user processes              (-u)  5547
open files                      (-n)  184320
virtual mem size        (kbytes, -v)  unlimited
swap limit              (kbytes, -w)  unlimited
sbsize                   (bytes, -b)  unlimited
pseudo-terminals                (-p)  unlimited

และสำหรับการอ้างอิงอย่างง่าย ๆ นี่คือคำอธิบายสำหรับ sysctls:

kern.maxfiles: Maximum number of files
kern.openfiles: System-wide number of open files
kern.maxfilesperproc: Maximum files allowed open per process

ที่เกี่ยวข้อง


4
ulimit ไม่ใช่ส่วนกลางคุณแน่ใจหรือว่า ulimit เดียวกันกับ MySQL ของคุณใช้งานอยู่
Derobert

1
ดังนั้นฉันสามารถดูว่าค่า ulimit สำหรับ MySQL daemon ได้อย่างไรและฉันสามารถเปลี่ยนค่า ulimit สำหรับ daemon โดยไม่หยุด daemon ได้หรือไม่ ฉันรู้ว่าฉันสามารถตั้งค่าulimitในสคริปต์เริ่มต้นหรือสภาพแวดล้อมของเชลล์ แต่นั่นจะต้องให้ฉันขัดจังหวะฐานข้อมูล
Stefan Lasiewski

1
ดูใน / proc ใต้ส่วนย่อยด้วย PID ของบริการ mysql ของคุณ คุณสามารถcat limitsดูว่า mysql ทำงานด้วยอะไร นอกจากนี้คุณยังสามารถเปลี่ยนพวกเขาได้ทันที (ด้วยเคอร์เนลรุ่นใหม่): echo -n "Max open files=soft_value:hard_value" > /proc/$PID/limits(เป็นรากของหลักสูตร)
lornix

1
@lornix: นี่คือ FreeBSD ฉันไม่เคยใช้ BSD ด้วยตัวเอง แต่ฉันไม่แน่ใจว่า FreeBSD รองรับ / proc / * / limit จริงหรือไม่
Martin von Wittich

1
/procไม่ได้ติดตั้งโดยค่าเริ่มต้นบน FreeBSD แต่ทำด้วยตัวเองsudo mount -t procfs proc /procดูprocfs(5)ข้อมูลเพิ่มเติม เมื่อคุณ/procติดตั้งแล้วให้ดูที่/proc/$PID/rlimitไฟล์
zygis

คำตอบ:


1

ตรวจสอบ /etc/login.conf และดูว่าผู้ใช้ mysql ของคุณกำหนดระดับการเข้าสู่ระบบใด อาจเป็นค่าเริ่มต้นหรือดีมอน หากคุณต้องการเปลี่ยนข้อ จำกัด สำหรับผู้ใช้ของคุณสร้างคลาสใหม่กำหนดผู้ใช้ของคุณให้กับคลาสนั้นเปลี่ยนขีด จำกัด สำหรับคลาสนั้นตามที่คุณต้องการจากนั้นเรียกใช้ "cap_mkdb /etc/login.conf"

หากคุณยังไม่ได้อ่านให้ทำ: http://www.freebsd.org/doc/handbook/users-limiting.htm

กระบวนการที่เริ่มต้นเมื่อระบบเริ่มทำงานโดย / etc / rc ถูกกำหนดให้กับคลาสการล็อกอินdaemon


0

ในบางระบบปฏิบัติการมีการตั้งค่าขีด จำกัด เพื่อหลีกเลี่ยงปัญหาด้านความปลอดภัยสำหรับผู้ใช้ทั่วไปคุณควรพิจารณาการอ่านในman limits.conf
ไฟล์นี้กำหนดข้อ จำกัด ต่อกระบวนการเช่นจำนวนเธรดสูงสุดหรือจำนวนไฟล์เปิดสูงสุด ใบหน้าที่ใช้ข้อ จำกัด อาจมาจากที่นั่น /etc/security/limits.conf

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