ตัวอธิบายไฟล์ Ulimit ไม่ได้ถูกใช้สำหรับกระบวนการเฉพาะ


14

ฉันเพิ่งตรวจสอบหนึ่งในกระบวนการ redis ของเรากับสิ่งที่ ulimits ที่ใช้โดยใช้:

cat /proc/<redis-pid>/limits

และรู้สึกประหลาดใจที่ได้ทราบว่ามีค่าเริ่มต้นต่ำ:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

ฉันประหลาดใจเพราะเรามีการกำหนดค่าต่อไปนี้:

# /etc/sysctl.conf 
fs.file-max = 100000

.

# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

.

# /etc/ssh/sshd_config
UsePAM yes

.

# /etc/pam.d/sshd
session required pam_limits.so

ใครสามารถบอกฉันได้ว่าทำไม ulimit ที่เพิ่มขึ้นไม่ได้ถูกนำไปใช้กับกระบวนการ redis ที่กำลังทำงานอยู่?

กระบวนการ redis ทำงานในฐานะผู้ใช้ 'redis' เซิร์ฟเวอร์ได้รับการรีบูตเนื่องจากข้อ จำกัด เพิ่มขึ้น เราอยู่ใน Debian Squeeze

คำตอบ:


19

ในขีด จำกัด ของทรัพยากรลินุกซ์สามารถตั้งค่าในสถานที่ต่าง ๆ ตามประเภทของความต้องการ

  1. /etc/security/limits.conf ไฟล์.
  2. /etc/sysctl.conf ไฟล์.
  3. ulimit คำสั่ง

/etc/security/limits.confเป็นส่วนหนึ่งของpam_limitsและดังนั้นข้อ จำกัด ที่ตั้งค่าในไฟล์นี้จะถูกอ่านโดยโมดูล pam_limits ในระหว่างช่วงการเข้าสู่ระบบ เซสชั่นเข้าสู่ระบบสามารถโดยหรือผ่านssh terminalและ pam_limits จะไม่ส่งผลกระทบต่อกระบวนการภูตเป็นที่กล่าวถึงที่นี่

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

ulimitใช้คำสั่งเพื่อตั้งค่าขีด จำกัด ของเชลล์ ดังนั้นเมื่อมีการตั้งค่าขีด จำกัดulimitบนเชลล์กระบวนการที่ได้รับมาจากเปลือกจะได้รับค่านั้นเช่นกันเนื่องจากกฎที่child processสืบทอดparent processesคุณสมบัติ

และสำหรับกรณีของคุณเนื่องจากการredisเริ่มต้นเป็นส่วนหนึ่งของข้อinitใดข้อหนึ่งข้างต้นจะช่วยคุณโดยตรง วิธีที่เหมาะสมในการทำเช่นนี้คือคุณต้องใช้ulimitคำสั่งเพื่อตั้งค่าใหม่ในสคริปต์เริ่มต้นเอง เหมือนด้านล่างในสคริปต์

ulimit -n 100000
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.

มีอยู่แล้วข้อผิดพลาดที่ยื่นในสิ่งที่ปรารถนาที่จะเพิ่ม คุณสมบัติในการulimitstart-stop-daemon

ตรวจสอบredisการกำหนดค่าด้วยหากมีวิธีใดบ้างในการกำหนดขีด จำกัด


บทสรุปที่ยอดเยี่ยม Kannan! ตอนนี้ฉันได้ไปข้างหน้าและเพิ่ม ulimit ในสคริปต์เริ่มต้น เป็นเรื่องน่าเสียดายที่ไม่มีวิธีใดเพียงแค่กำหนดขีด จำกัด สำหรับผู้ใช้ซึ่งจะทำงานกับกระบวนการ deamonised (เนื่องจากเรามีสคริปต์เริ่มต้นหลายตัว) แต่ใช้งานได้ ขอขอบคุณ!
UpTheCreek

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

2

พารามิเตอร์ sysctl fs.file-max คือขีด จำกัด ของระบบทั่วโลกที่กว้างฉันไม่คิดว่าเป็นการตั้งค่าความคิดที่ดีในค่าที่เหมือนกัน

หากคุณตั้งค่าเป็น ulimit 100000 และใน sysctl.conf 100000 เช่นกันผู้ใช้หนึ่งรายสามารถบล็อกระบบได้

ไม่ว่าจะด้วยวิธีใดก็ตามพูดคุยเกี่ยวกับปัญหาของคุณคุณต้องการให้แน่ใจว่าระบบของคุณใช้ pam_limits

man pam_limits
grep -i limit /etc/pam.d/*

ขอบคุณ - ฉันจะพิจารณาเพิ่มค่า fs.file-max แล้ว เกี่ยวกับ pam - ฉันเชื่อว่าเราใช้สิ่งนี้อยู่ (ฉันได้เพิ่มการตั้งค่าเพิ่มเติมบางอย่างลงในคำถาม) ฉันไม่แน่ใจจริงๆว่าฉันเข้าใจ PAM อย่างไรเนื่องจากการตั้งค่าของเราดูเหมือนจะเกี่ยวข้องกับ SSH ซึ่งผู้ใช้นี้ไม่ได้ใช้ มีไฟล์อื่น ๆ ที่ฉันต้องกำหนดค่าอีกไหม? ฉันสามารถตั้งค่า ulimit ในสคริปต์เริ่มต้นสำหรับ redis ได้ แต่ไม่ต้องทำสิ่งนี้
UpTheCreek

2

คุณเปิดใช้งาน pam_limits สำหรับ sshd แต่คำสั่งนี้จะถูกเรียกใช้จากเซสชัน SSH หรือไม่ คุณอาจจะต้องเพิ่มบรรทัดเดียวกันไป/etc/pam.d/loginและ / หรือและ/etc/pam.d/su / หรือ/etc/pam.d/sudo


ขอบคุณ ฉันสงสัยว่ามันไม่ถูกต้องนัก กระบวนการนี้จะถูกเริ่มต้นบรรทัดนี้ในสคริปต์ if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGSinit.d: แพมไหนที่เหมาะสมในกรณีนี้
UpTheCreek

ในสคริปต์ของคุณคุณสามารถใช้ ulimit -n 100000
c4f4t0r

สคริปต์ init.d ใช้su [user] -cคำสั่งเพื่อเริ่มสคริปต์ในฐานะผู้ใช้รายอื่นหรือโปรแกรมของคุณทำงานในฐานะรูทหรือไม่ ถ้ามันใช้แล้วคุณต้องการใส่ไว้ในsu /etc/pam.d/suหากคุณกำลังใช้งานอยู่rootคุณน่าจะดีกว่าด้วยคำแนะนำของ c4f4t0r ในการเพิ่มulimitคำสั่งในสคริปต์เริ่มต้นของคุณ rootได้รับอนุญาตให้ตั้งค่าขีด จำกัด ใด ๆ ที่ต้องการดังนั้นคุณไม่จำเป็นต้องกังวลเกี่ยวกับ pam สำหรับกรณีนี้
Omnipresence

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