เหตุใดจึงมีการ จำกัด รายงานซ้ำถึง 1024 ไฟล์แม้หลังจากอัปเดตเป็น limit.conf แล้ว


9

ฉันเห็นข้อผิดพลาดนี้ที่ด้านบนของไฟล์ redis.log ของฉัน:

ไฟล์ที่เปิดสูงสุดในปัจจุบันคือ 1024 maxclients ถูกลดเหลือ 4064 เพื่อชดเชย ulimit ต่ำ

ฉันได้ทำตามขั้นตอนเหล่านี้เพื่อจดหมาย (และรีบูต):

ยิ่งกว่านั้นฉันเห็นสิ่งนี้เมื่อฉันทำงานulimit:

ubuntu@ip-XX-XXX-XXX-XXX:~$ ulimit -n
65535

ข้อผิดพลาดนี้กว้างขวางหรือไม่ ถ้าไม่ฉันต้องทำอะไรในขั้นตอนอื่น ฉันกำลังใช้ Redis 2.8.13 (ส่วนปลายของต้นไม้) บน Ubuntu LTS 14.04.1 (อีกครั้งที่ส่วนปลายของต้นไม้)

นี่คือข้อมูลผู้ใช้:

ubuntu@ip-XX-XXX-XXX-XXX:~$ ps aux | grep redis
root      1027  0.0  0.0  66328  2112 ?        Ss   20:30   0:00 sudo -u ubuntu /usr/local/bin/redis-server /etc/redis/redis.conf
ubuntu    1107 19.2 48.8 7629152 7531552 ?     Sl   20:30   2:21 /usr/local/bin/redis-server *:6379               

เซิร์ฟเวอร์ทำงานเป็น ubuntu

นี่คือไฟล์ limit.conf ของฉันที่ไม่มีความคิดเห็น:

ubuntu@ip-XX-XXX-XXX-XXX:~$ cat /etc/security/limits.conf | sed '/^#/d;/^$/d'
ubuntu soft nofile 65535
ubuntu hard nofile 65535
root soft nofile 65535
root hard nofile 65535

และนี่คือผลลัพธ์ของ sysctl fs.file-max:

ubuntu@ip-XX-XXX-XXX-XXX:~$ sysctl -a| grep fs.file-max
sysctl: permission denied on key 'fs.protected_hardlinks'
sysctl: permission denied on key 'fs.protected_symlinks'
fs.file-max = 1528687
sysctl: permission denied on key 'kernel.cad_pid'
sysctl: permission denied on key 'kernel.usermodehelper.bset'
sysctl: permission denied on key 'kernel.usermodehelper.inheritable'
sysctl: permission denied on key 'net.ipv4.tcp_fastopen_key'

เป็น sudo

ubuntu@ip-10-102-154-226:~$ sudo sysctl -a| grep fs.file-max
fs.file-max = 1528687

นอกจากนี้ฉันเห็นข้อผิดพลาดนี้ที่ด้านบนของไฟล์ redis.log ไม่แน่ใจว่าเกี่ยวข้องหรือไม่ มันสมเหตุสมผลแล้วที่ผู้ใช้ Ubuntu ไม่ได้รับอนุญาตให้เปลี่ยนไฟล์สูงสุดที่เปิดอยู่ แต่เนื่องจากมี ulimits สูงที่ฉันพยายามตั้งเขาไม่จำเป็นต้อง:

[1050] 23 Aug 21:00:43.572 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
[1050] 23 Aug 21:00:43.572 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.

คำตอบ:


4

คุณควรแก้ไขไฟล์ภายใน/etc/pam.d/ไดเรกทอรี

ในกรณีของคุณเมื่อคุณเรียกใช้sudo -u ubuntu /usr/local/bin/redis-serverคุณควรเพิ่มบรรทัดต่อไปนี้ไปยัง/etc/pam.d/sudoหรือ/etc/pam.d/common-session-noninteractiveในกรณี/etc/pam.d/sudoรวมถึงสิ่งนี้:

session required pam_limits.so

/etc/security/limits.confนี้จะช่วยให้การตั้งค่าการกำหนดค่าให้ไว้ภายใน


นั่นมัน! ขอบคุณมาก. เสียงเหมือนการเปลี่ยนจาก Ubuntu 2012.04 LTS เป็น Ubuntu 2014.04 LTS
esilver

ดีใจที่ได้ช่วยคุณ แน่นอน xubuntu ของฉัน 14.04 ไม่มีบรรทัดนี้ภายใน /etc/pam.d/sudo ไม่สามารถตรวจสอบ 12.04 ได้ในขณะนี้
Navern

เมื่อใช้ systemd บน Debian โปรดดูserverfault.com/questions/770037/…
tholu

3

คำแนะนำสำหรับผู้ใช้ที่ค้นหาโพสต์นี้ซึ่งมีปัญหาไม่เกี่ยวข้องกับ pam_limits.so ในกรณีของฉัน Redis ถูกเปิดตัวผ่านทาง supervisord ในกรณีนี้วิธีการที่ supervisord เปลี่ยนบริบทผู้ใช้ทำให้เซสชันใหม่นั้นถูกเรียกใช้ด้วยข้อ จำกัด เริ่มต้นของระบบไม่ใช่วิธีที่ฉันได้กำหนดค่าสำหรับผู้ใช้

วิธีการแก้ปัญหาในกรณีที่พบที่นี่ สิ่งที่สั้นคือคุณต้องกำหนดขีด จำกัด ผ่าน ulimit -n เป็นส่วนหนึ่งของคำสั่งเริ่มต้นใน supervisord

ตัวอย่าง:

[program:redis-a]
command=bash -c "ulimit -n 32768; exec /usr/local/bin/redis-server /etc/redis/a.conf"

1

รวมถึงการเพิ่มขีด จำกัด การเปิดไฟล์ คุณต้องเพิ่ม maxclients ใน redis.conf ของคุณ เป็นค่าเริ่มต้นเพียง 10,000 เท่านั้น

# Once the limit is reached Redis will close all the new connections sending
# an error 'max number of clients reached'.
maxclients 1024000

0

หมายเหตุสำหรับผู้ใช้ Ubuntu คนอื่นที่มีปัญหาคล้ายกัน:

หากคุณกำลังเริ่ม Redis เมื่อบู๊ต f.ex ผ่านทาง Upstart คุณสามารถตั้งค่าขีด จำกัด นี้ด้วย stanza "limit"

ดังนั้นสำหรับ Nofile:

limit nofile 4096 4096

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