Rumah >Operasi dan penyelenggaraan >Keselamatan >Bagaimana untuk menyelesaikan kesalahan Ulimit
Saya menghadapi masalah yang sangat menarik baru-baru ini. Terdapat sekumpulan HAProxy yang kerap mengalami masalah. Log masuk ke pelayan dan semak CPU, memori, rangkaian dan IO. Akhirnya didapati bahawa terdapat lebih daripada 60,000 sambungan dalam keadaan TIME_WAIT mesin.
Status TIME_WAIT biasanya muncul pada mesin proksi seperti HAProxy dan Nginx, terutamanya disebabkan oleh penutupan aktif yang kerap. Dengan mengubah suai parameter guna semula dan kitar semula, masalah itu boleh diselesaikan dengan cepat.
Statistik status rangkaian boleh dikira menggunakan arahan berikut.
netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}' ESTABLISHED 70 FIN_WAIT2 30 CLOSING 33 TIME_WAIT 65520
Ini bukan perkara ajaib, tetapi nombor 65535 terlalu sensitif. Ia sepatutnya mencetuskan beberapa jenis had atas.
Apa yang membuatkan kami lebih keliru ialah: Mengapa perkhidmatan tidak tersedia apabila sambungan dalam keadaan TIME_WAIT hanya mencapai 65535?
Adakah tuntutan berjuta-juta sambungan bagi setiap mesin semuanya membual? anda tidak boleh tahan dengan masalah?
65535, yang bermaksud sama dengan 2 hingga kuasa ke-16 tolak satu, ialah nombor ajaib. Mengetepikan nombor kecil ini buat masa ini, mari kita fahami terlebih dahulu berapa banyak kapasiti sambungan yang disokong Linux.
1. Berapa banyak sambungan yang boleh disokong oleh Linux? Tetapi terdapat hanya 65535 port.
Mengapa hanya terdapat 65535 port?Protokol TCP dan UDP masing-masing menggunakan 16 bit pada permulaan untuk menyimpan nombor port sumber dan nombor port destinasi ini berdasarkan sebab sejarah. Malangnya, nilai ini adalah jenis pendek dan saiznya juga 2^16-1. Piawaian yang tidak boleh diubah yang disebabkan oleh sebab sejarah sangat berakar umbi. Berapa banyak sambungan yang boleh disokong oleh Linux? Ambil nginx sebagai contoh, kami memantaunya pada port 80. Pada masa ini, mesin A bersambung ke Nginx dan boleh memulakan sehingga 60,000 sambungan panjang. Jika mesin B bersambung ke Nginx, ia juga boleh memulakan 60,000 berbilang sambungan. Ini kerana penentuan sambungan ditentukan oleh src dan dst. Idea bahawa Linux hanya boleh menerima 65535 sambungan hanya boleh dikatakan sebagai andaian yang sangat dangkal. 65535 port, yang mungkin terlalu kecil untuk anda sebagai penguji tekanan. Tetapi untuk pelayan, ia lebih daripada mencukupi.2. Bagaimanakah cara untuk menyokong berjuta-juta sambungan?
Seperti yang anda lihat daripada di atas, tiada had untuk bilangan sambungan. Tetapi Linux mempunyai satu lagi lapisan perlindungan, iaitu bilangan pemegang fail. Perkara-perkara yang dilihat melalui arahan lsof adalah apa yang dipanggil pemegang fail.
Mari kita lihat paparan beberapa arahan. ulmit, menunjukkan bilangan pemegang fail yang boleh diduduki oleh setiap proses.ulimit -n 65535fail-maks, menunjukkan jumlah bilangan pemegang fail yang boleh diduduki oleh sistem pengendalian, untuk semua proses.
cat /proc/sys/fs/file-max 766722file-nr, menunjukkan bilangan pemegang yang sedang digunakan dan jumlah bilangan pemegang. Boleh digunakan untuk pemantauan.
cat /proc/sys/fs/file-nr 1824 0 766722Untuk menyokong berjuta-juta sambungan, pemegang tahap sistem pengendalian dan pengendalian tahap proses perlu dikeluarkan. Dalam erti kata lain, paparan ulimit dan fail-maks mestilah lebih besar daripada satu juta.
3. Bagaimana untuk menetapkannya?
Walaupun penyelesaian yang biasa digunakan adalah ulimit untuk menetapkan bilangan pemegang proses, saya amat mengesyorkannya tidak. Hanya proses yang dimulakan dalam shell yang sama akan dipengaruhi oleh tetapan ulimit, tanpa sebab lain. Jika anda membuka cangkerang lain atau but semula mesin, perubahan ulimit akan hilang. Ini ialah kaedah berikut:
ulimit -n 1000000Cara yang betul ialah mengubah suai fail /etc/security/limits.conf. Sebagai contoh, kandungan berikut.
root soft nofile 1000000 root hard nofile 1000000 * soft nofile 1000000 * hard nofile 1000000Seperti yang anda lihat, kami boleh mengubah suai bilangan pemegang untuk pengguna tertentu. Ini sering ditemui semasa memasang aplikasi seperti es.
es - nofile 65535Menggunakan kaedah ini, anda masih perlu membuka cangkerang baharu untuk beroperasi. Perintah ini tidak akan berkuat kuasa sama ada dalam shell yang diubah suai atau dalam shell sebelum pengubahsuaian. xjjdog telah menghadapi beberapa kes di mana masalah masih berlaku walaupun sekatan telah ditarik balik. Melihat pada fail yang dipetakan memori proses boleh menentukan sama ada perubahan ini telah berkuat kuasa. Sebagai contoh, dalam arahan "cat /proc/180323/limits", maklumat terperinci akan dipaparkan. Nilai ini tidak ditetapkan setinggi yang anda mahukan. Had atas saiznya ditentukan oleh nr_open. Untuk meningkatkan saiz, tukar nilai fs.nr_open dalam /ect/sysct.conf.
cat /proc/sys/fs/nr_open 1048576Jika anda ingin mengubah suai parameter maksimum fail, adalah disyorkan untuk menambah kandungan berikut pada fail /etc/sysctl.conf. Terdapat lebih daripada 6 juta!
fs.file-max = 6553560Apabila bilangan fail melebihi, kernel ralat: VFS: had maksimum fail 65535 dicapai akan dilaporkan. Untuk meringkaskan.
Walaupun Linux membuka port, ia boleh menerima sejumlah besar sambungan. Had atas sambungan ini dihadkan oleh bilangan pemegang fail dalam satu proses dan bilangan pemegang fail dalam sistem pengendalian, iaitu ulimit dan fail-maks.
Untuk meneruskan pengubahsuaian parameter, kami cenderung untuk menulis perubahan pada fail. Had pemegang fail proses boleh diletakkan dalam /etc/security/limits.conf, dan had atasnya dihadkan oleh fs.nr_open had pemegang fail sistem pengendalian boleh diletakkan dalam /etc/sysctl.conf fail. Akhir sekali, pastikan anda menyemak fail /proc/$id/limits untuk mengesahkan sama ada pengubahsuaian telah berkuat kuasa dalam proses tersebut.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan kesalahan Ulimit. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!