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 65535
cat /proc/sys/fs/file-max 766722
cat /proc/sys/fs/file-nr 1824 0 766722
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 1000000
root soft nofile 1000000 root hard nofile 1000000 * soft nofile 1000000 * hard nofile 1000000
es - nofile 65535
cat /proc/sys/fs/nr_open 1048576
fs.file-max = 6553560
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!