Cara menghindari “Terlalu banyak membuka file” di debian

8

Jika saya ingin melihat semua file log yang relevan dari server apache2 saya sekaligus, saya menggunakan

tail -f /var/kunden/logs/*log /var/kunden/logs/*log /var/log/apache2/*log |grep -v robots|grep -v favicon

Tetapi karena sudah terlalu banyak file sekarang, saya ingin menambahkan batasan itu.

Bagaimana saya bisa meningkatkannya untuk satu sesi ssh? Dan Bagaimana saya bisa meningkatkannya ke seluruh sistem secara global?

Saya dapat melihat batas file terbuka adalah 1024 di komputer saya:

ulimit -n
1024
rubo77
sumber
Melebihi batas file seringkali merupakan pertanda adanya masalah. Seperti yang sudah disebutkan, Anda mungkin memiliki masalah dengan rotasi log. (Rotated log dapat membatalkan perintah Anda.) Di luar / var / log / apache2 seharusnya tidak ada banyak (ada) log yang terkait dengan server Apache Anda. Berdasarkan pola grep Anda, Anda mungkin ingin membatasi akses Anda ke log akses.
BillThor
terima kasih atas petunjuknya, tetapi logrotaion saya berfungsi dengan baik. Saya memiliki begitu banyak log, karena semua 1025 domain di server saya memiliki file log sendiri;)
rubo77
1
Pola Anda terlihat seperti mereka juga akan mengambil log kesalahan serta log akses. Ini harus menjadi masalah kecil jika Anda memiliki log kesalahan tunggal. Jika Anda membiarkannya tetap berjalan di shell, Anda mungkin ingin menggunakannya -Fsebagai gantinya -fagar log dibuka kembali saat diputar.
BillThor

Jawaban:

15

Penting untuk mengetahui bahwa ada dua jenis batasan:

  • Sebuah batas keras dikonfigurasi oleh root saja. Ini adalah nilai tertinggi (batas) untuk batas lunak.
  • Sebuah batas yang lembut dapat diatur oleh pengguna biasa. Ini adalah batas aktual yang berlaku.

Solusi untuk satu sesi

Dalam shell mengatur batas lunak:

ulimit -Sn 2048

Contoh ini akan menaikkan batas aktual menjadi 2048 tetapi perintah hanya akan berhasil jika batas keras (centang:) ulimit -Hnsama atau lebih tinggi. Jika Anda membutuhkan nilai yang lebih tinggi, naikkan batas hard menggunakan salah satu metode di bawah ini. Batas ditetapkan per proses dan diwarisi oleh proses yang baru lahir, jadi apa pun yang Anda jalankan setelah perintah ini di shell yang sama akan memiliki batas baru.

Mengubah batas keras dalam satu sesi

Ini tidak mudah karena hanya root yang dapat mengubah batas keras dan setelah beralih ke root, Anda harus beralih kembali ke pengguna asli. Inilah solusinya dengan sudo:

sudo sh -c "ulimit -Hn 9000 ; exec su \"$USER\""

Solusi seluruh sistem

Di Debian dan banyak sistem lain yang menggunakan pam_limitsAnda dapat mengatur batas seluruh sistem di dalam /etc/security/limits.confdan di dalam file /etc/security/limits.d. File conf berisi deskripsi. Baris contoh:

@webadmins       hard     nofile     16384
@webadmins       soft     nofile      8192

Ini akan menetapkan batas keras dan batas lunak default untuk pengguna dalam grup webadminssetelah login.

Batas lainnya

Nilai batas keras dibatasi oleh batas global nilai deskriptor file terbuka /proc/sys/fs/file-maxyang secara default cukup tinggi di distribusi Linux modern. Nilai ini dibatasi oleh NR_OPENnilai yang digunakan selama kompilasi kernel.

Apakah tidak ada solusi yang lebih baik?

Mungkin Anda dapat memeriksa apakah semua *logfile yang Anda berikan tail -fadalah file yang benar-benar aktif yang perlu dipantau. Ada kemungkinan bahwa beberapa dari mereka sudah ditutup untuk pencatatan dan Anda hanya dapat membuka sejumlah kecil file.

pabouk
sumber
ulimit -Sn 4096 -bash: ulimit: buka file: Kann die Grenze nicht ändern: Das Argument ist ungültig - berarti argumen tersebut tidak valid
rubo77
@ rubo77: Saya menambahkan informasi tentang batas keras yang kemungkinan besar merupakan penyebab masalahnya.
pabouk
@ rubo77: Dimungkinkan juga untuk menetapkan batas keras dalam sesi shell tetapi apakah itu rumit karena Anda harus sumelakukan root dan sukembali ke pengguna:su -c "ulimit -Hn 6000 ; su $USER"
pabouk
OK, jadi untuk perubahan sementara batas yang akan saya gunakan ulimit -Hn 6000; ulimit -Sn 6000sebagai root
rubo77
1
@amenthes Saya kira maksud Anda file konfigurasi di /etc/limits.*. Batas ini diterapkan setiap kali modul PAM pam_limits.sodipanggil. Biasanya pada awal sesi. Misalnya di Ubuntu 14.04 itu di alat-alat / perintah: cron, login(text console login), lightdm(GUI login), su. Anda dapat mengatur di mana pam_limitsdigunakan /etc/pam.*. Lihat misalnya: faqs.org/docs/securing/chap5sec44.html
pabouk
0

Saya memiliki Peringatan PHP di error.log Apache saya:

failed to open stream: Too many open files in ...

Jadi saya tahu, apache menetapkan nilai ini satu per satu saat memulai (pada Ubuntu 14.04 saya). Ini dikonfigurasi dalam /etc/apache2/envvars. Ia mengatakan:

## If you need a higher file descriptor limit, uncomment and adjust the
## following line (default is 8192):
#APACHE_ULIMIT_MAX_FILES='ulimit -n 65536'

jadi saya harus menyesuaikan baris ketiga.

Michael
sumber