ulimit -n และ / proc / sys / fs / file-max แตกต่างกันอย่างไร


32

ฉันสังเกตเห็นว่าในภาพ CentOS ใหม่ที่ฉันเพิ่งบูทขึ้นจาก EC2 ว่าค่าเริ่มต้น ulimit คือ 1024 เปิดไฟล์ แต่ / proc / sys / fs / file-max ตั้งไว้ที่ 761,408 และฉันสงสัยว่าทั้งสองขีด จำกัด ทำงานอย่างไร ด้วยกัน. ฉันคาดเดา ulimit -n จำกัด จำนวนตัวอธิบายไฟล์ต่อผู้ใช้ในขณะที่ / proc / sys / fs / file-max เป็นระบบกว้างหรือไม่ หากเป็นเช่นนั้นสมมติว่าฉันได้เข้าสู่ระบบเป็นสองเท่าของผู้ใช้เดียวกัน - ผู้ใช้ที่เข้าสู่ระบบแต่ละคนมีขีด จำกัด 1024 ของจำนวนไฟล์ที่เปิดหรือว่าเป็นข้อ จำกัด ของ 1024 ไฟล์ที่เปิดรวมระหว่างแต่ละไฟล์ ในผู้ใช้?

และมีผลกระทบต่อประสิทธิภาพการตั้งค่าตัวอธิบายไฟล์สูงสุดของคุณเป็นจำนวนที่สูงมากหากระบบของคุณไม่เคยเปิดไฟล์จำนวนมาก?


เพิ่มแท็ก: ทรัพยากรระบบเคอร์เนล bash linux
Warner

คำตอบ:


28

file-maxเป็น File Descriptors สูงสุด (FD) ที่บังคับใช้ในระดับเคอร์เนลซึ่งไม่สามารถผ่านกระบวนการทั้งหมดโดยไม่เพิ่มขึ้น จะถูกบังคับใช้ในระดับกระบวนการซึ่งสามารถน้อยกว่าulimitfile-max

file-maxไม่มีความเสี่ยงที่ส่งผลกระทบต่อประสิทธิภาพการทำงานโดยเพิ่มขึ้นเป็น การแจกแจงสมัยใหม่มีค่า FD สูงสุดที่ค่อนข้างสูง แต่ในอดีตนั้นจำเป็นต้องมีการคอมไพล์และการแก้ไขเคอร์เนลเพื่อเพิ่ม 1024 ที่ผ่านมาฉันจะไม่เพิ่มทั้งระบบเว้นแต่คุณจะมีความต้องการด้านเทคนิค

การกำหนดค่าต่อกระบวนการมักจะต้องมีการปรับแต่งเพื่อให้บริการ daemon เฉพาะไม่ว่าจะเป็นฐานข้อมูลหรือเว็บเซิร์ฟเวอร์ หากคุณลบข้อ จำกัด ทั้งหมด daemon นั้นอาจทำให้หมดทรัพยากรระบบที่มีอยู่ทั้งหมด หมายความว่าคุณจะไม่สามารถแก้ไขปัญหาได้ยกเว้นโดยการกดปุ่มรีเซ็ตหรือการหมุนเวียนของกำลัง แน่นอนว่าไฟล์ใดไฟล์หนึ่งอาจทำให้ไฟล์ที่เปิดอยู่เสียหาย


ความเข้าใจของฉันถูกต้องหรือไม่ว่าขีด จำกัด ต่อผู้ใช้ถูกกำหนดโดยใช้ ulimit จะเหมือนกันสำหรับผู้ใช้ทั้งหมดหรือไม่ มีวิธีการใช้ค่าที่แตกต่างกันต่อผู้ใช้หรือไม่?
Oliver

ใช่การตั้งค่าสามารถตั้งค่าได้ทั้งแบบโกลบอลและแบบต่อผู้ใช้
วอร์เนอร์

หากฉันได้รับการโพสต์ของคุณถูกต้องนี่ไม่ใช่ความจริง มันเป็นกระบวนการต่อโดยผู้ใช้ xy และนี่คือข้อ จำกัด โดยระบบไฟล์สูงสุดที่กำหนดไว้ใน /etc/sysctl.conf
Jeredepp

3
ulimitขีด จำกัด ไม่ได้ต่อผู้ใช้ แต่ต่อกระบวนการ! ดูunix.stackexchange.com/questions/55319/…
Tonin

@Tonin - ใช่คำตอบนี้ผิด
Nemo

11

ข้อ จำกัด ของ ulimit มีต่อผู้ใช้ที่ไม่ซ้ำกัน ดังนั้น user1 โดยไม่คำนึงถึงจำนวนครั้งที่เข้าสู่ระบบหรือกระบวนการทำงานจะถูก จำกัด ที่ 1024 มันรวมกัน

ฉันไม่แน่ใจว่าฉันเข้าใจความหมายของประโยคนั้นอย่างสมบูรณ์หรือไม่ (ภาษาอังกฤษไม่ใช่ภาษาแม่ของฉัน) หากประโยคนั้นหมายถึงการกำหนดค่า ulimit สำหรับตัวอธิบายไฟล์ไม่ใช่ข้อ จำกัด ต่อกระบวนการคำตอบที่ยอมรับ (AFAIK) นั้นผิด

สิ่งที่ฉันหมายถึงคือถ้าผู้ใช้บางคนได้เปิดตัว 4 กระบวนการและการกำหนดค่า ulimit สำหรับ FDs คือ 1024 แต่ละกระบวนการอาจเปิด 1024 FDs ผู้ใช้จะไม่ถูก จำกัด ที่ 1024 FDs แต่กระบวนการที่เปิดตัวโดยผู้ใช้นั้น

ตัวอย่างเช่น:

me@superme:~$ ulimit -n
1024
me@superme:~$ lsof | grep $USER | wc -l
8145

นี่คือตัวอย่างของ perl ที่เราไปถึงขีด จำกัด (เป็นขีด จำกัด ต่อกระบวนการ):

#!/usr/bin/perl

$count = 0;
@filedescriptors;

while ($count <= 1024) {
    $FILE = ${count};
    open $FILE, ">", "/tmp/example$count" or die "\n\n FDs: $count $!";
    push(@filedescriptors, $FILE);
    $count ++;
}

ผล:

FDs: 1021 Too many open files at ./test.pl line 8.

1,021 เพราะมี 3 ตัวอธิบายไฟล์ที่เปิดอยู่ก่อนที่จะถึงห่วงขณะที่ (stdout, stdin และ stderr)

ขออภัยถ้าฉันผิดอย่างสมบูรณ์หรือเข้าใจผิดคำตอบ


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