Batas deskriptor file Ulimit tidak diterapkan untuk proses tertentu

14

Saya baru-baru ini memeriksa salah satu proses redis kami untuk mengetahui berapa banyak ulimit mana diterapkan menggunakan

cat /proc/<redis-pid>/limits

Dan terkejut mengetahui bahwa itu berada pada nilai standar rendah:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

Saya terkejut, karena kami memiliki konfigurasi berikut:

# /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

Adakah yang bisa memberi tahu saya mengapa peningkatan ulimit tidak diterapkan pada proses redis yang sedang berjalan?

Proses redis berjalan sebagai pengguna 'redis', server telah di-reboot sejak batasnya ditingkatkan. Kami berada di Debian Squeeze.

UpTheCreek
sumber

Jawaban:

19

Dalam batas sumber daya Linux dapat diatur di berbagai lokasi berdasarkan jenis kebutuhan.

  1. /etc/security/limits.conf mengajukan.
  2. /etc/sysctl.conf mengajukan.
  3. ulimit perintah

/etc/security/limits.confadalah bagian dari pam_limits dan batas yang ditentukan dalam file ini dibaca oleh modul pam_limits selama sesi login. Sesi masuk bisa sshmelalui atau melalui terminal. Dan pam_limits tidak akan memengaruhi proses daemon seperti yang disebutkan di sini .

/etc/sysctl.confadalah konfigurasi global yang luas sistem, kami tidak dapat menetapkan konfigurasi khusus pengguna di sini. Ini menetapkan jumlah maksimum sumber daya yang dapat digunakan oleh semua pengguna / proses yang dilakukan.

ulimitPerintah ini digunakan untuk mengatur batas shell. Dan ketika batas ditetapkan ulimitpada shell, proses yang dihasilkan dari shell mendapatkan nilai itu juga karena aturan yang child processmewarisi parent processesproperti.

Jadi untuk kasus Anda, karena redisdimulai sebagai bagian dari inittidak ada di atas akan membantu Anda secara langsung. Cara yang tepat untuk melakukan ini adalah bahwa, Anda harus menggunakan ulimitperintah untuk menetapkan nilai baru dalam skrip init itu sendiri. Seperti di bawah ini dalam skrip,

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

Sudah ada bug yang diajukan di wishlist untuk menambahkan ulimitfitur start-stop-daemon .

Periksa juga rediskonfigurasi jika ada cara untuk memberikan batasan di sana.

Kannan Mohan
sumber
Ringkasan hebat Kannan! Saya sekarang telah melanjutkan dan menambahkan ulimit ke skrip startup. Sangat disayangkan tidak ada cara hanya menetapkan batas untuk pengguna yang akan bekerja dengan proses deamonised (karena kami memiliki beberapa skrip startup), tetapi ini berfungsi. Terima kasih!
UpTheCreek
Jawaban yang bagus Proses anak yang mewarisi properti proses orangtua adalah yang mengejutkan saya, batasnya semua tampak benar bagi pengguna yang menjalankan proses anak, tetapi itu adalah batas dari pemilik proses induk yang sedang digunakan.
sinkronkan
2

Parameter sysctl fs.file-max adalah batas sistem global yang luas, saya tidak berpikir itu adalah ide yang bagus dalam pengaturan nilai yang sama.

Jika Anda mengatur di ulimit 100000 dan juga di sysctl.conf 100000, satu pengguna dapat memblokir sistem

Bagaimanapun, berbicara tentang masalah Anda, Anda harus yakin, sistem Anda menggunakan pam_limits

man pam_limits
grep -i limit /etc/pam.d/*
c4f4t0r
sumber
Terima kasih - Saya akan mempertimbangkan untuk menaikkan nilai fs.file-max. Mengenai pam - Saya yakin kami menggunakan ini (Saya telah menambahkan beberapa konfigurasi tambahan untuk pertanyaan). Saya tidak begitu yakin saya mengerti PAM, karena pengaturan kami tampaknya berhubungan dengan SSH, yang tidak digunakan oleh pengguna ini. Apakah ada file lain yang perlu saya konfigurasi? Saya selalu bisa meletakkan pengaturan ulimit di skrip init untuk redis, tetapi lebih suka tidak harus melakukan ini.
UpTheCreek
2

Anda telah mengaktifkan pam_limits untuk sshd, tetapi apakah perintah ini dijalankan dari sesi SSH? Anda mungkin perlu menambahkan baris yang sama ke /etc/pam.d/logindan / atau /etc/pam.d/sudan / atau /etc/pam.d/sudo.

Kemahahadiran
sumber
Terima kasih. Saya curiga itu tidak benar. Proses ini sedang mulai baris ini di script init.d: if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS. Pam mana yang cocok untuk kasus ini?
UpTheCreek
dalam skrip Anda, Anda dapat menggunakan ulimit -n 100000
c4f4t0r
Apakah skrip init.d menggunakan su [user] -cperintah untuk memulai skrip sebagai pengguna lain, atau apakah program Anda berjalan sebagai root? Jika menggunakan su, maka Anda akan memasukkannya /etc/pam.d/su. Jika Anda menjalankan sebagai root, Anda mungkin lebih baik dengan saran c4f4t0r untuk menambahkan ulimitperintah dalam skrip init Anda. rootdiizinkan untuk menetapkan batas apa pun yang diinginkannya, sehingga Anda tidak perlu khawatir tentang pam untuk kasus itu.
Omnipresence
1
Terima kasih. Ini digunakan --chuid redis:redispada start-stop-daemon. Saya telah menambahkan ulimit ke skrip startup sekarang.
UpTheCreek