FreeBSD: "Terlalu banyak file terbuka" tetapi harus dapat membuka 160.000 file lainnya

11

Saya memiliki sistem FreeBSD 8 yang menjalankan ZFS, dengan server MySQL 5.5 yang sekitar 355GB dan diproyeksikan akan tumbuh menjadi beberapa Terabyte.

MySQL memicu kesalahan tentang "Terlalu banyak file terbuka" di /etc/hosts.allow. Kami tidak secara tegas menggunakan /etc/hosts.allow, tetapi digunakan oleh hosts_access (3) ( libwrap.a), yang digunakan oleh banyak hal.

mysqld[1234]: warning: /etc/hosts.allow, line 15: cannot open /etc/hosts.allow: Too many open files

Tetapi ketika saya memeriksa sepertinya sudah mengenai batas yang sebenarnya. Jumlah file terbuka yang dilaporkan di kern.openfiles staysbawah 40.000 selama periode yang berkelanjutan, dan batas kami jauh lebih tinggi:

# sysctl -a |grep files
kern.maxfiles: 204800
kern.maxfilesperproc: 184320
kern.openfiles: 38191

# ulimit -n
184320

Openfiles harus diatur ke tidak terbatas:

# grep openfiles /etc/login.conf
    :openfiles=unlimited:\

MySQL mengatakan harus dapat membuka 184320 file menangani:

# mysqladmin variables | grep open_files_limit
| open_files_limit                              |     184320                |

Dan beberapa informasi dari perspektif pengguna MySQL. Saya berhenti mysql dan diretas /usr/local/etc/rc.d/mysql-serveruntuk mencetak variabel-variabel ini, jadi ini harus mewakili lingkungan MySQL. Perhatikan bahwa angka 184320 konsisten dengan yang di atas.

# /usr/local/etc/rc.d/mysql-server.stefantest start
Starting mysql.
cpu time               (seconds, -t)  unlimited
file size           (512-blocks, -f)  unlimited
data seg size           (kbytes, -d)  33554432
stack size              (kbytes, -s)  524288
core file size      (512-blocks, -c)  unlimited
max memory size         (kbytes, -m)  unlimited
locked memory           (kbytes, -l)  unlimited
max user processes              (-u)  5547
open files                      (-n)  184320
virtual mem size        (kbytes, -v)  unlimited
swap limit              (kbytes, -w)  unlimited
sbsize                   (bytes, -b)  unlimited
pseudo-terminals                (-p)  unlimited

Dan, untuk referensi mudah di sini adalah deskripsi untuk sysctl:

kern.maxfiles: Maximum number of files
kern.openfiles: System-wide number of open files
kern.maxfilesperproc: Maximum files allowed open per process

Terkait

Stefan Lasiewski
sumber
4
ulimit bukan global, apakah Anda yakin itu ulimit yang sama dengan yang dijalankan oleh MySQL Anda?
derobert
1
Jadi, dapatkah saya melihat apa nilai ulimit untuk daemon MySQL, dan bisakah saya mengubah nilai ulimit untuk daemon tanpa menghentikan daemon? Saya tahu saya dapat mengatur ulimitskrip startup atau lingkungan shell, tetapi itu akan mengharuskan saya mengganggu database.
Stefan Lasiewski
1
Lihat di / proc, di bawah subdir dengan PID layanan mysql Anda. Anda dapat cat limitsmelihat apa yang sedang berjalan dengan mysql. Anda juga dapat mengubahnya dengan cepat (dengan kernel yang lebih baru): echo -n "Max open files=soft_value:hard_value" > /proc/$PID/limits(sebagai root tentu saja)
lornix
1
@lornix: ini FreeBSD. Saya sendiri belum pernah menggunakan BSD, tetapi saya tidak yakin apakah FreeBSD benar-benar mendukung / proc / * / limit.
Martin von Wittich
1
/proctidak dipasang secara default di FreeBSD, tetapi lakukan sendiri sudo mount -t procfs proc /proc, lihat procfs(5)info lebih lanjut. Setelah Anda menginstal /proc, lihat /proc/$PID/rlimitfile
zygis

Jawaban:

1

Periksa /etc/login.conf dan cari tahu kelas login mana yang ditugaskan untuk pengguna mysql Anda. Mungkin default atau daemon. Jika Anda ingin mengubah batas untuk pengguna Anda, buat kelas baru, tetapkan pengguna Anda ke kelas itu, ubah batasan untuk kelas itu sesuka Anda dan kemudian jalankan "cap_mkdb /etc/login.conf"

Jika Anda belum membaca ini, lakukan: http://www.freebsd.org/doc/handbook/users-limiting.htm

Proses yang dimulai saat startup sistem oleh / etc / rc ditugaskan ke kelas login daemon .

Mike Diehn
sumber
0

Pada beberapa OS batas ditetapkan untuk menghindari masalah keamanan untuk pengguna biasa, Anda harus mempertimbangkan membaca ketika dalam man limits.conf
File ini mendefinisikan batas per proses seperti jumlah maksimum utas atau jumlah maksimum dari file terbuka. Keterbatasan penggunaan wajah bisa berasal dari sana. /etc/security/limits.conf

Kiwy
sumber