วิธีการตั้งค่า ulimits สำหรับบริการที่เริ่มต้นเมื่อบูท?


18

ฉันต้องการให้ mysql ใช้หน้าใหญ่เพื่อตั้ง ulimit - ฉันทำสิ่งนี้ใน limit.conf แล้ว อย่างไรก็ตาม limit.conf (pam_limits.so) ไม่ได้รับการอ่านสำหรับ init เท่านั้นสำหรับเชลล์ "ของจริง" ฉันแก้ไขมันก่อนโดยการเพิ่ม "ulimit -l" ในฟังก์ชั่นเริ่มต้น initscript ฉันต้องการวิธีที่สามารถทำซ้ำได้บางอย่างตอนนี้กล่องได้รับการจัดการโดยพ่อครัวและเราไม่ต้องการรับไฟล์ที่ RPM เป็นเจ้าของจริงๆ


โปรดดูเพื่อดูว่าคุณกำลังกดจุดบกพร่องเดียวกัน serverfault.com/questions/415570/…
Minto Joseph

คำตอบ:


8
$ echo "* hard nofile 102400" >> /etc/security/limits.conf
$ echo "* soft nofile 102400" >> /etc/security/limits.conf
$ sysctl -w fs.file-max=102400
$ sysctl -p

4 ขั้นตอนสามารถเปลี่ยนขีด จำกัด ของระบบได้ทันทีและยังสามารถใช้งานได้หลังจากรีบูต คุณสามารถเปลี่ยนหมายเลข "102400" เป็นจำนวนไฟล์เปิดสูงสุดในระบบ linux ของคุณตามที่คุณต้องการ และ

$ sysctl -p

เพื่อโหลดการตั้งค่า sysctl จากไฟล์ที่ระบุหรือ /etc/sysctl.conf หากไม่ได้รับ


2
limit.conf ไม่ได้ถูกอ่านโดย inittab เพราะ limit.so ไม่ได้ถูกอ่าน คุณอาจแฮ็ค PAM ได้ แต่ฉันไม่สามารถอ่านไฟล์ที่อ่านได้
Xarses

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

@ Xarses ถูกต้อง limit.conf จะไม่ถูกนำไปใช้กับ daemon บางตัวโดยเริ่มตั้งแต่เวลาบูต ฉันไม่เชื่อว่าสิ่งนี้จะตอบคำถามได้
นักเล่นแร่แปรธาตุ

2

/etc/sysctl.conf ควรสามารถตั้งค่ารายการ ulimits ฉันไม่สามารถทดสอบสิ่งนี้ได้ดี แต่แบบสำรวจบอกว่าคุณควรจะหยุดได้หลังจากตั้งค่าเป็น sysctl.conf

ฉันพบหัวข้อต่าง ๆ ที่แสดงว่ายังมีปัญหาอยู่และทีมของฉันและฉันได้พูดคุยเกี่ยวกับตัวเลือกบางอย่างเกี่ยวกับเรื่องนี้เราพบวิธีแก้ไขปัญหาที่อาจเกิดขึ้นสองประการ

ตัวเลือก 1: rhel initscripts source /etc/init.d/functions ส่วนใหญ่คุณสามารถเปลี่ยนการตั้งค่า ulimit ที่นั่น

ตัวเลือกที่ 2: init อ้างว่า / etc / initscript มีที่มาทุกครั้งก่อนที่จะ spawns init สิ่งที่เห็น: http://linux.die.net/man/5/initscript น่าสนใจพอที่พวกเขาพูดในที่ซึ่งผู้คนสามารถตั้ง ulimit =)


1

ตัวอย่างข้อมูลสูตรแบบตัวเองมีพื้นฐานจาก URL นี้:

http://pro.benjaminste.in/post/318453669/increase-the-number-of-file-descriptors-on-centos-

ตัวอย่างสูตร:

ruby_block "edit /etc/sysctl.conf" do
  _file = "/etc/sysctl.conf"
  _comment = "# TWEAK BY CHEF"
  _content = "fs.file-max = 512000"
  block do
    file = Chef::Util::FileEdit.new(_file)
    file.insert_line_if_no_match(/#{Regexp.escape(_comment)}/, "#{_comment}\n#{_content}")
    file.write_file
  end
  not_if "cat #{_file} | grep '#{_comment}'"
  notifies :run, "execute[sysctl -p]", :immediately
end

execute "sysctl -p" do
  command "sysctl -p"
  returns 255 # which would normally signify error, but doesn't on sysctl on CentOS
  action :nothing
end

ruby_block "edit /etc/security/limits.conf" do
  _file = "/etc/security/limits.conf"
  _comment = "# TWEAK BY CHEF"
  _content = "* - nofile 65535"
  block do
    file = Chef::Util::FileEdit.new(_file)
    file.insert_line_if_no_match(/#{Regexp.escape(_comment)}/, "#{_comment}\n#{_content}")
    file.write_file
  end
  not_if "cat #{_file} | grep '#{_comment}'"
end

0

วิธีแก้ปัญหาของฉันคือการทำสิ่งนี้ในสูตรพ่อครัวของเรา:

# Ensure ulimits are properly set for the initscript
bash "Set Ulimits" do
    user "root"
    code <<-EOH
    echo -e "n#Setting ulimits. Performed by chef recipe MYSQLULIMIT\nulimit -l" >> /etc/sysconfig/init
    EOH
    not_if "grep MYSQLULIMIT /etc/sysconfig/init"
end

นี่ทำให้การulimit -lตั้งค่าสำหรับ initscripts ทั้งหมดซึ่งอาจไม่เป็นที่พึงปรารถนาในบางสภาพแวดล้อม แต่ก็ใช้ได้สำหรับฉัน

ในโลกที่สมบูรณ์แบบฉันจะได้รับการอัปเดต RPM เพื่อรวม a /etc/sysconfig/mysqldและวางคำสั่ง ulimit -l เดียวกันไว้ในนั้น


0

ไม่แน่ใจว่านี่คือ distro-specific อย่างไร แต่ฉันเพิ่งเพิ่มการจำกัดความปลอดภัยโดยใช้/etc/security/limits.d/20-somefile.confใน Ubuntu

แทนที่จะต้องแก้ไขไฟล์ที่มีอยู่ฉันมีเทมเพลต ERB ในตำราของฉันตั้งค่าคุณสมบัติเริ่มต้นในไฟล์คุณลักษณะแล้วไม่ต้องกังวลกับการใช้บล็อก ruby ​​กับเนื้อหา "insert_line_if_no_match" ซึ่งดูเหมือนจะซับซ้อนขึ้นเล็กน้อยและ สูตรนี้อ่านง่ายกว่านี้หน่อย:

execute "activate_sysctl" do
  user "root"
  command "sysctl -p /etc/sysctl.d/10-filemax.conf"
  action :nothing
end

template "/etc/sysctl.d/10-filemax.conf" do
  source "system/filemax.conf"
  action :create
  notifies :run, "execute[activate_sysctl]", :immediately
end

และนี่คือไฟล์เทมเพลตของฉัน:

fs.filemax = <%= node[:mycookbook][:system_fs_filemax] %>

0

ตาม ulimit หน้าคนเลิก คุณต้องใช้ setrlimit ปัญหาคือว่าเป็นการเรียกระบบแทนคำสั่ง bash

ฉันมีปัญหากับหัวหน้างานและนี่คือสิ่งที่ฉันค้นพบ หากกระบวนการไม่มีไฟล์กำหนดค่าที่อนุญาตให้คุณโทรไปยัง setrlimit () การโทรของระบบ ตั้งค่าด้วย ulimit บนสคริปต์ทุบตี /etc/init.d นั่นคือสคริปต์บริการที่เริ่มกระบวนการของคุณ

หากกระบวนการมีไฟล์กำหนดค่าเช่น supervisor d คุณสามารถใช้ไฟล์กำหนดค่านั้นเพื่อตั้งค่าจำนวนไฟล์และให้กระบวนการดำเนินการโทรโดยตรงไปยัง setrlimits ()

หัวหน้างาน: http://supervisord.org/configuration.html#supervisord-section-settings

TomcaT: http://www.jayway.com/2012/02/11/how-to-really-fix-the-too-many-open-files-problem-for-tomcat-in-ubuntu/


0

วิธี RedHat ที่อธิบายไว้ในบทความ 253043 (ต้องสมัครสมาชิก) คือการเพิ่มงบ ulimit /etc/sysconfig/<service name>ที่เหมาะสมในการ ตัวอย่างเช่น:

# echo "ulimit -SHn 10240   # nfile" >> /etc/sysconfig/myServiceName

(ใช้ไฟล์ที่มีอยู่สำหรับบริการของคุณแทน myServiceName)

สำหรับ daemons ที่เริ่มต้นโดยไม่ใช้สคริปต์ RedHat "sysconfig" คุณจะต้องเพิ่มบรรทัด ulimit ที่เหมาะสมลงในสคริปต์เริ่มต้น daemon


-1

ลองตั้งค่านั้นในไฟล์ /etc/sysctl.conf


มีชิ้นส่วนของการกำหนดค่าที่จำเป็นในการทำสิ่งนี้ซึ่งอยู่ใน sysctl.conf และมีอยู่ในสถานที่ - เราเพียงแค่ต้องปรับเปลี่ยน ulimits เพื่อให้สามารถเข้าถึง hugepages เหล่านั้นได้
jayofdoom

-1

จริง ๆ แล้วฉันเขียนตำราพ่อครัวส่วนตัวที่ใช้ในการตั้ง ulimit สำหรับเราและใช้งานได้ดีทีเดียว สำหรับ Ubuntu เราพบเคล็ดลับต่อไปนี้เป็นสิ่งจำเป็นหากคุณต้องการการตั้งค่า ulimit แบบโกลบอล:

เพิ่มสิ่งต่อไปนี้ในเซสชันทั่วไปของคุณ:

session required        pam_limits.so

และใน limit.conf คุณต้องมีสิ่งต่อไปนี้:

* soft  nofile  64000
* hard  nofile  65000

root  soft  nofile  64000
root  hard  nofile  65000

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

อีกตัวเลือกหนึ่งที่เราใช้สำหรับ Tomcat คือการปรับใช้ Tomcat แล้วเขียนทับสคริปต์เริ่มต้นด้วยแบบกำหนดเองซึ่งเราจะตั้ง ulimit สำหรับและเริ่มต้นใหม่ Tomcat มันใช้งานได้ดี แต่ก็แฮ็คได้มากกว่าเดิมเล็กน้อย

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


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