มีไฟล์ที่เปิดมากเกินไปใน Debian


15

ฉันใช้เวลานานมากที่ Debian เมื่อถึงจุดหนึ่งข้อผิดพลาด:

เปิดไฟล์มากเกินไป

วิ่ง:

ulimit -a

แสดงให้เห็นว่า:

เปิดไฟล์ (-n) 1024

ฉันต้องการเพิ่มจำนวนไฟล์ที่เปิดอยู่ 2 ครั้ง หลังจากการประหารชีวิต

ulimit -n 2048

ขีด จำกัด ใช้งานได้จนถึงสิ้นสุดเซสชันของฉันซึ่งไม่สามารถใช้ได้กับงาน

ฉันจะเพิ่มจำนวนไฟล์ที่เปิดอย่างถาวรได้อย่างไร

คำตอบ:


12

หากกระบวนการของคุณเริ่มต้นด้วยสคริปต์คุณสามารถโทรเพื่อ ulimit ในสคริปต์ก่อนดำเนินการ daemon

หากคุณต้องการเพิ่ม ulimit สำหรับผู้ใช้ของคุณหรือสำหรับผู้ใช้ทั้งหมดคุณสามารถกำหนดขีด จำกัด ที่ใช้ผ่านการpam_limitsเข้าสู่ระบบ /etc/security/limits.confเหล่านี้จะตั้งอยู่ใน ในกรณีของคุณคุณสามารถทำสิ่งที่ชอบ:

*               hard    nofile             2048

โปรดทราบว่า "ยาก" หมายถึงขีด จำกัด ฮาร์ด - ขีด จำกัด ที่ไม่สามารถเกินและไม่สามารถเปลี่ยนแปลงได้ ผู้ใช้สามารถเปลี่ยนแปลงขีด จำกัด ซอฟต์ (เช่นบางคนที่ไม่มีความสามารถของรูท) แต่ไม่เกินขีด จำกัด ฮาร์ด

อ่านข้อมูลเพิ่มเติมเกี่ยวกับการใช้limits.confpam_limits


ที่ขีด จำกัด ฉันมี 2 บรรทัด: * soft nofile 4096 * hard nofile 8192 ซึ่งไม่มีผลใด ๆ
FoxyBOA

และคุณออกจากระบบแล้วอีกครั้งตั้งแต่ทำการทดสอบเหล่านี้ นี้จะหมายถึงการเข้าออกทางขวาของ X / GNOME / KDE ฯลฯ ถ้าคุณกำลังพยายามนี้บนเครื่องท้องถิ่น
แดเนียลลอว์สัน

ใช่. /etc/security/limits.conf ใช้งานไม่ได้สำหรับฉัน ฉันจะลองวิธีที่สอง
FoxyBOA

3
/etc/security/limits.conf ทำงานได้เฉพาะกับบริการที่ใช้ pam และโมดูล pam pam_limits (ดู /etc/pam.d/ สำหรับการกำหนดค่า PAM ของแต่ละบริการและ /etc/pam.d/common-* โดยเฉพาะ) . มันเกี่ยวข้องกับเซสชันผู้ใช้ทั้งหมดที่สร้างโดย sshd, gdm, ล็อกอิน, ฯลฯ มันไม่เกี่ยวข้องกับโปรแกรมทั้งหมดที่เริ่มต้นตอนบูต ...
Raphaël Hertzog

ฉันพูดอะไรบางอย่างกับเอฟเฟกต์นั้น แต่ขอบคุณที่ทำให้ชัดเจน OP ไม่ได้ชี้แจงว่าเป็นบริการหรือกระบวนการที่ผู้ใช้กำลังทำงานอยู่
Daniel Lawson

13

นอกจากนี้ยังมี "รวมสูงสุด" ของไฟล์ที่เปิดอยู่ในเคอร์เนลคุณสามารถตรวจสอบการตั้งค่าปัจจุบันด้วย:

cat /proc/sys/fs/file-max 

และตั้งค่าใหม่ด้วย:

echo "104854" > /proc/sys/fs/file-max

หากคุณต้องการที่จะเก็บการตั้งค่าระหว่างการรีบูตเพิ่ม

sys.fs.file-max=104854

ถึง

/etc/sysctl.conf

วิธีตรวจสอบการใช้งานไฟล์สูงสุดในปัจจุบัน:

[root@srv-4 proc]# cat /proc/sys/fs/file-nr
3391    969     52427
|        |       |
|        |       |
|        |       maximum open file descriptors
|        total free allocated file descriptors
total allocated file descriptors
(the number of file descriptors allocated since boot)


ฉันแสดงตัวเลขลามกอนาจารที่นี่: 49152 0 18446744073709551615 . ฉันไม่เข้าใจว่าทำไมคอลัมน์สองคอลัมน์แรกไม่รวมกันเป็นคอลัมน์ที่สาม และถ้าฉันมี 1.8 ล้านล้านล้านที่มีอยู่ฉันไม่เห็นว่าฉันใช้มันทั้งหมดอย่างไร
mlissner

4

ดังที่คนอื่น ๆ บอกว่าคุณสามารถใช้ข้อ จำกัด เฉพาะต่อผู้ใช้หรือกลุ่มใน /etc/security/limits.conf

หมายเหตุ: ulimit -n แสดงขีด จำกัด แบบนุ่ม

ulimit -H -n 

จะแสดงขีด จำกัด ที่ยาก

สิ่งนี้ทำให้ ulimit -a และ ulimit -n เอาต์พุตค่อนข้างสับสนหากคุณกำลังเพิ่มจำนวนไฟล์จาก 1024 ถึง 4096 ตามที่คุณคาดหวังว่าจะเห็นเอาต์พุตฮาร์ด จำกัด แต่คุณยังคงเห็น 1024 ซึ่งนุ่ม จำกัด

นอกจากนี้โปรดจำไว้ว่าข้อ จำกัด เหล่านี้มีผลบังคับใช้ต่อการเข้าสู่ระบบดังนั้นให้ลงชื่อเข้าใช้เชลล์ใหม่และตรวจสอบการเปลี่ยนแปลงของคุณอย่าคาดหวังว่าพวกเขาจะเผยแพร่สู่การเข้าสู่ระบบที่มีอยู่


2

โปรดทราบว่าหากคุณเรียกใช้กระบวนการของคุณโดยการตั้งค่า start-stop-daemon ulimits ใน /etc/security/limits.conf จะไม่ทำงาน หากคุณต้องการยกระดับขีด จำกัด การเปิดไฟล์สำหรับ Tomcat เป็น 20000 คุณจะต้องเพิ่มสิ่งเหล่านี้ในบรรทัดเพื่อ/etc/default/tomcat:

ulimit -Hn 32768
ulimit -Sn 32768

ฉันพบปัญหานี้บนเดเบียน 6.0.4 สำหรับกระบวนการอื่น ๆ คำตอบที่ให้ควรช่วยได้


1

ขึ้นอยู่กับว่าคุณจะเริ่มกระบวนการที่ใช้เวลานาน หากมันเริ่มต้นที่เวลาบูต (ผ่าน /etc/rcX.d/* สคริปต์) จากนั้นคุณต้องทำการเรียก ulimit ในสคริปต์เริ่มต้นของคุณเนื่องจากขีด จำกัด เริ่มต้นถูกตั้งค่าโดยเคอร์เนลและไม่สามารถปรับแต่งได้หากไม่ทำการคอมไพล์ใหม่

การใช้/etc/security/limits.confสามารถใช้งานได้หากคุณใช้cronเพื่อเริ่มต้นด้วยตัวอย่างเช่นรายการ:

@reboot $HOME/bin/my-program

ที่ควรจะทำงานเพราะ /etc/pam.d/cron เปิดใช้งาน pam_limits.so


-1

คุณสามารถเพิ่มได้ใน /etc/security/limits.conf

root soft nofile 100000
root hard nofile 100000

บันทึกจากนั้นรีบูต


3
มีอะไรใหม่ที่นี่ที่ไม่ได้อยู่ในคำตอบสำหรับคำถามอายุ 5 ปีนี้หรือไม่?
Andrew Schulman

-2

คำสั่งที่ดีมากคือulimit -nแต่มีปัญหากับการเชื่อมต่อมากเกินไปและเปิดไฟล์มากเกินไป:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 519357
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

ฉันพยายามที่จะล้างคำตอบของคุณ แต่ฉันยังไม่ชัดเจนว่าคุณกำลังพยายามพูดอะไรกับคำถามต้นฉบับ คุณสามารถลองและทำความสะอาดสิ่งนี้ต่อไปได้หรือไม่?
slm

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