แก้ไข ulimit (เปิดไฟล์) ของกระบวนการเฉพาะ


27

เป็นไปได้ไหมที่จะเปลี่ยนขีด จำกัดซอฟต์และฮาร์ดของกระบวนการเฉพาะ ?

ในกรณีของฉันกระบวนการของฉันคือmongodและแหล่งข้อมูลบนเว็บมากมายบอกให้ฉันดำเนินการอย่างง่ายๆ

ulimit -n <my new value>

ความคิดปัจจุบันของฉัน:

  • คำสั่งจะรู้ถึงขีด จำกัด ของกระบวนการที่ฉันจะแก้ไขได้อย่างไร สิ่งนี้จะไม่แก้ไขขีด จำกัด การเปิดไฟล์ทั้งหมดของระบบหรือ
  • ฉันเดาว่าคำสั่งนี้จะเปลี่ยนการ จำกัด นุ่ม ดังนั้นจะมีวิธีเพิ่มขีด จำกัด ฮาร์ดด้วยหรือไม่

คุณได้อ่านข้อมูลที่มีค่านี้แล้วหรือยัง? docs.mongodb.org/manual/reference/ulimit
tink

ใช่ฉันเรียนรู้ทั้งหมดด้วยหัวใจ .. ฉันไม่แน่ใจว่าฉันทำอะไรบางอย่างหายไป แต่หน้านั้นจะบอกวิธีดูรายละเอียดเท่านั้น มันบอกให้คุณเขียน ulimit -n <ค่า>>
ทดสอบ

คำตอบ:


29

กระบวนการสามารถเปลี่ยนข้อ จำกัด ผ่านการsetrlimit(2)เรียกของระบบ เมื่อคุณวิ่งulimit -nคุณควรเห็นตัวเลข นั่นเป็นข้อ จำกัด ในปัจจุบันเกี่ยวกับจำนวนตัวอธิบายไฟล์ที่เปิด (ซึ่งรวมถึงไฟล์ซ็อกเก็ตไพพ์ ฯลฯ ) สำหรับกระบวนการ ulimitคำสั่งประหารชีวิตgetrlimit(2)เรียกระบบเพื่อหาสิ่งที่มูลค่าปัจจุบันคือ

นี่คือจุดสำคัญ: กระบวนการสืบทอดขีด จำกัด ปัจจุบันจากกระบวนการหลัก ดังนั้นถ้าคุณวิ่งulimit -n 64คุณจะตั้งค่าขีด จำกัด ของตัวอธิบายไฟล์แบบเปิดของเชลล์เป็น 64 กระบวนการใด ๆ ที่เชลล์สตาร์ทจะมีขีด จำกัด เท่ากันยกเว้นว่ากระบวนการใหม่นั้นเรียกsetrlimit()อย่างเหมาะสม

หากต้องการเปลี่ยนmongodb'sขีด จำกัด ตัวอธิบายไฟล์แบบเปิดคุณจะเรียกใช้ulimit -n 2048(หรือเคอร์เนลจำนวนมากของคุณที่อนุญาต) ในเชลล์ mongodbจากนั้นคุณจะใช้เปลือกหอยที่จะเริ่มต้น ในฐานะที่เป็นกระบวนการลูกmongodbจะได้รับการ จำกัด (ขนาดใหญ่) ในตัวอธิบายไฟล์ที่เปิด

หากต้องการแก้ไขไฟล์ จำกัด ของระบบเปิดซึ่งดูเหมือนว่าเหมือนผลรวมของทุกกระบวนการเปิดแฟ้มวงเงินบ่งคุณต้องทำสิ่งที่ชอบปรับเปลี่ยนและเรียกใช้/etc/sysctl.conf sysctl -pดูค่าของพารามิเตอร์ในfs.file-max/etc/sysctl.conf


ช่างเป็นคำอธิบายที่ดีมาก! ขอบคุณมาก. ฉันจะลองทันที!
ทดสอบ

คำตอบนี้ช่วยฉันได้มาก แต่ปัญหาในตอนนี้คือขีด จำกัด ที่ยากคือ 2048 และนี่ไม่เพียงพอในกรณีของฉัน 1) ฉันจะค้นหาขีด จำกัด ที่เคอร์เนลอนุญาตได้อย่างไร 2) เป็นไปได้ไหมที่จะเปลี่ยน HARD LIMIT ตอนนี้ ขอบคุณอีกครั้ง!
ทดสอบ

@test - ฉันไม่เคยเพิ่มขีด จำกัด อย่างหนัก พบสิ่งนี้: blog.samat.org/2011/04/05/… และwiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linuxนี้พวกเขาพูดในสิ่งเดียวกัน
Bruce Ediger

18

การเปลี่ยนข้อ จำกัด prlimitของกระบวนการทำงานคุณอาจใช้คำสั่งยูทิลิตี้

prlimit --pid 12345 --nofile=1024:1024

setrlimit(2)อะไรที่ไม่ภายในคือการโทร man page ของ prlimit ควรมีตัวอย่างการเรียกที่มีประโยชน์

ที่มา: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/


สิ่งนี้ช่วยชีวิตฉันไว้ขอบคุณ ฉันมีกระบวนการ Python ที่ใช้เวลานานซึ่งก่อให้เกิดtoo many files openข้อผิดพลาด คำตอบของคุณแก้ไขปัญหาของฉันโดยไม่หยุดกระบวนการ
Visionscaper

1

อย่างน้อยบน Linux, distros ส่วนใหญ่ดูเหมือนจะใช้แพมสำหรับการรับรอง หนึ่งโมดูลที่มาพร้อมกับ pam คือโมดูลจำกัด การอ้างอิงจาก README สำหรับ pam_limits:

The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.

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

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

$ cat /etc/security/limits.d/mysql.conf
@mysql           soft    nofile          100000
@mysql           hard    nofile          200000

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

อีกสิ่งหนึ่งที่คุณสามารถทำได้หากคุณอยู่ในระบบที่ได้รับ RedHat โดยทั่วไปคือการวางสาย ulimit ที่คุณต้องการในสคริปต์ / etc / sysconfig / $ SERVICE ตัวอย่างเช่นสคริปต์เริ่มต้นของ apache ชื่อ /etc/init.d/httpd และมันจะจัดหาไฟล์การกำหนดค่า / etc / sysconfig / httpd หากพบ ฉันพบว่าง่ายต่อการจัดการโดยการทำเช่นนี้แทนที่จะแก้ไขสคริปต์ init เองเพราะสคริปต์ init ได้รับการอัปเดตเมื่อมีการอัปเกรด rpm แต่ไฟล์ sysconfig จะได้รับการอัปเดตหากไม่เปลี่ยนแปลงจากค่าเริ่มต้น


ทางออกที่ดีที่สุดและใช้งานได้จริง
nelaaro

0

คำสั่งจะรู้ถึงขีด จำกัด ของกระบวนการที่ฉันจะแก้ไขได้อย่างไร สิ่งนี้จะไม่แก้ไขขีด จำกัด การเปิดไฟล์ทั้งหมดของระบบหรือไม่

คำสั่งจะเปลี่ยนข้อ จำกัด สำหรับกระบวนการปัจจุบัน (เชลล์ของคุณ) และกระบวนการลูกใด ๆ (ทุกสิ่งที่คุณเรียกใช้จากเชลล์ในภายหลัง)

กระบวนการถูกจัดระเบียบในทรี ทุกกระบวนการมีผู้ปกครอง (ซึ่งเรียกใช้) หมายเลขกระบวนการ 1, init เป็นกระบวนการพิเศษที่เป็นกระบวนการหลักของตัวเอง เครื่องมือเช่น htop หรือ top สามารถแสดงให้คุณเห็นกระบวนการที่แสดงเป็นแผนผังของผู้ปกครองและเด็ก ๆ

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