Apa rumus untuk menentukan berapa banyak memori yang dikonsumsi oleh sebuah soket di Linux?

11

Saya sedang melakukan perencanaan kapasitas dan saya bertanya-tanya apakah ada formula yang bisa saya gunakan untuk memprediksi (dari sudut pandang memori) berapa banyak koneksi TCP yang bisa saya tangani di server saya. Saat ini, saya hanya memikirkan kebutuhan memori.

Beberapa variabel yang saya pikir akan muncul dalam rumus adalah:

  • sysctl net.ipv4.tcp_wmem(min atau nilai default)
  • sysctl net.ipv4.tcp_rmem(min atau nilai default)
  • ukuran sock, sock_common, proto dan struktur data per-socket lainnya.

Saya tidak yakin berapa banyak tcp_wmem dan tcp_rmem yang benar-benar dialokasikan dan kapan memori itu dialokasikan. Pada waktu pembuatan soket? Sesuai permintaan?

Tim Stewart
sumber

Jawaban:

2

Jika Anda dapat memodifikasi kode sumber, maka gunakan data rusage untuk mengukur RSS dan catat berapa banyak koneksi TCP yang dimainkan pada saat pengukuran.

Jika kode sumber tidak dapat diubah, maka gunakan RSS aplikasi jaringan seperti yang dilaporkan oleh top atau ps dan dapatkan jumlah koneksi jaringan pada saat pengukuran dimulai lsof -i.

Kumpulkan data ini setiap menit saat aplikasi Anda bergerak melalui beban puncak, dan dari data itu Anda bisa membuat formula yang menghubungkan jumlah koneksi dengan penggunaan RAM.

Tentu saja ada lebih banyak hal yang dapat Anda ukur, khususnya Anda mungkin ingin mengukur penggunaan RAM kernel, meskipun struktur data tcp harus dapat diprediksi dan dihitung sebelumnya. Bagaimanapun, lihat pertanyaan ini /server/10852/what-limits-the-maximum-number-of-connections-on-a-linlin-server untuk informasi lebih lanjut tentang penyetelan TCP dan cara mendapatkan pandangan yang jelas tentang apa yang terjadi di tumpukan jaringan.

Michael Dillon
sumber
Terima kasih telah menekankan pengukuran dan mengarahkan saya ke tautan yang menunjukkan cara mengumpulkan metrik itu!
Tim Stewart
8

tcp_mem lebih penting karena mendefinisikan bagaimana tcp stack seharusnya berperilaku ketika menyangkut penggunaan memori. IMO kirim dan terima buffer harus merupakan kelipatan dari tcp_mem. Berikut ini tautan ke rumus untuk menerima buffer: http://www.acc.umu.se/~maswan/linux-netperf.txt . Pendeknya:

Overheadnya adalah: window / 2 ^ tcp_adv_win_scale (default tcp_adv_win_scale adalah 2) Jadi untuk parameter default linux untuk jendela recieve (tcp_rmem): 87380 - (87380/2 ^ 2) = 65536. Diberi tautan transatlantik (150 ms RTT), kinerja maksimum berakhir pada: 65536 / 0,150 = 436906 byte / detik atau sekitar 400 kbyte / detik, yang sangat lambat hari ini. Dengan ukuran standar yang ditingkatkan: (873800 - 873800/2 ^ 2) /0.150 = 4369000 byte / s, atau sekitar 4Mbytes / s, yang beresonansi untuk jaringan modern. Dan perhatikan bahwa ini adalah default, jika pengirim dikonfigurasi dengan ukuran jendela yang lebih besar, ia akan dengan senang hati meningkatkan hingga 10 kali lipat ini (8738000 * 0,75 / 0,150 = ~ 40Mbytes / s), cukup bagus untuk jaringan modern.

Inilah yang dikatakan artikel tentang tcp_mem:

Apa yang Anda hapus adalah batas buatan untuk kinerja tcp, tanpa batas itu Anda dibatasi oleh bandwidth dan kerugian end-to-end yang tersedia. Jadi Anda mungkin menjenuhkan uplink Anda lebih efektif, tetapi tcp pandai menangani hal ini.

IMO nilai tcp_mem tengah yang lebih besar mempercepat koneksi dengan hilangnya keamanan yang lebih rendah dan sedikit meningkatkan penggunaan memori.

Anda dapat memantau tumpukan jaringan dengan:

grep skbuff /proc/slabinfo
Gigameg
sumber
1
Terima kasih atas tanggapan yang informatif. Ini menunjukkan betapa saya perlu belajar tentang jaringan.
Tim Stewart
1

David telah memberikan jawaban yang sangat bagus untuk pertanyaan yang diajukan, namun kecuali jika Anda secara eksklusif menggunakan LFN , kemudian bahkan pada server berbasis peristiwa, buffer TCP cenderung hanya sebagian kecil dari jejak per koneksi.

Untuk perencanaan kapasitas tidak ada pengganti untuk menguji server dan menghitung regresi penggunaan memori oleh beban.

symcbean
sumber
Terima kasih, itu hebat ketika formula sederhana akan dilakukan, tetapi ada saat-saat ketika Anda hanya perlu mengukur.
Tim Stewart