Apa latensi DALAM pusat data? Saya bertanya ini dengan asumsi ada urutan besarnya perbedaan

17

Saya mencoba mencari tahu sesuatu yang tidak bisa saya temukan jawabannya.

Jika saya mengatakan cache REDIS (atau cache di-memori eksternal) yang duduk di pusat data, dan server aplikasi yang duduk di pusat data yang sama, apa yang akan menjadi kecepatan koneksi jaringan (latensi, throughput) untuk membaca data antara dua mesin ini?

Akankah jaringan "kecepatan", misalnya, masih setidaknya urutan besarnya lebih tinggi daripada kecepatan RAM yang mencari data saya keluar dari cache pada REDIS?

Pertanyaan pamungkas saya adalah - apakah semua ini tersimpan dalam memori pada REDIS sebenarnya menyediakan utilitas apa pun? Berbeda dengan jika REDIS melakukan caching semua ini ke SSD? Memori itu mahal. Jika jaringan memang bukan hambatan DALAM pusat data, maka memori memiliki nilai. Kalau tidak, tidak.

Saya kira pertanyaan umum saya adalah meskipun tidak diketahui luas di pusat data dan ketidakmampuan untuk menggeneralisasi serta varians, apakah kita berbicara perintah yang cukup besar antara latensi memori dalam sistem komputer dan bahkan jaringan terbaik internal ke DC bahwa memori mengurangi latensi tidak memberikan peningkatan kinerja yang signifikan? Saya mendapatkan bahwa ada banyak variabel, tetapi seberapa dekat itu? Apakah sudah sangat dekat sehingga variabel-variabel ini penting? Sebagai contoh, ambil posisi hiperbolik di atasnya, tape drive lebih lambat dari jaringan, jadi tape tidak ideal untuk cache.

Neeraj Murarka
sumber
1
Ini juga tergantung pada jumlah perjalanan pulang pergi per transaksi, ini seringkali merupakan masalah nyata yang Anda serialkan dalam urutan kueri. Antarmuka kueri yang lebih kompleks, prosedur sisi server atau cache denormalizwd dapat mengurangi dampaknya.
eckes

Jawaban:

19

Ada beberapa versi "grafik latensi yang harus diketahui semua orang" seperti:

Masalahnya, pada kenyataannya, ada lebih dari sekadar latensi. Ini kombinasi faktor.

Jadi, apa latensi jaringan di dalam pusat data? Latency, well saya akan mengatakan itu "selalu" di bawah 1 ms. Apakah lebih cepat dari RAM? Tidak. Apakah dekat dengan RAM? Saya kira tidak.

Tetapi pertanyaannya tetap, apakah ini relevan. Apakah itu datum yang perlu Anda ketahui? Pertanyaan Anda masuk akal bagi saya. Karena semuanya memiliki biaya, sebaiknya Anda mendapatkan lebih banyak RAM sehingga semua data dapat tetap dalam RAM atau tidak masalah untuk membaca dari disk dari waktu ke waktu.

"Asumsi" Anda adalah bahwa jika latensi jaringan lebih tinggi (lebih lambat) daripada kecepatan SSD, Anda tidak akan memperoleh dengan memiliki semua data dalam RAM karena Anda akan memiliki lambat di jaringan.

Dan akan muncul begitu. Tapi, Anda juga harus memperhitungkan konkurensi akun. Jika Anda menerima 1.000 permintaan untuk data sekaligus, dapatkah disk melakukan 1.000 permintaan bersamaan? Tentu saja tidak, jadi berapa lama untuk melayani 1.000 permintaan itu? Dibandingkan dengan RAM?

Sulit untuk merebusnya menjadi satu faktor tunggal seperti beban berat. Tapi ya, jika Anda memiliki operasi tunggal, latensi jaringan sedemikian rupa sehingga Anda mungkin tidak akan melihat perbedaan SSD vs RAM.

Sama seperti sampai disk 12Gbps muncul di pasaran, tautan jaringan 10Gbps tidak akan kelebihan beban oleh satu aliran karena disk adalah hambatannya.

Tetapi ingat bahwa disk Anda melakukan banyak hal lain, proses Anda bukan satu-satunya proses pada mesin, jaringan Anda dapat membawa hal-hal yang berbeda, dll.

Juga, tidak semua aktivitas disk berarti lalu lintas jaringan. Permintaan basis data yang berasal dari aplikasi ke server basis data hanyalah lalu lintas jaringan yang sangat minim. Respons dari server database mungkin sangat kecil (satu nomor) atau sangat besar (ribuan baris dengan beberapa bidang). Untuk melakukan operasi, server (server basis data atau tidak) mungkin perlu melakukan beberapa pencarian disk, membaca dan menulis namun hanya mengirim sedikit kembali ke jaringan. Ini jelas bukan satu-untuk-satu network-disk-RAM.


Sejauh ini saya menghindari beberapa detail pertanyaan Anda - khususnya, bagian Redis.

Redis adalah open source (berlisensi BSD), penyimpanan struktur data dalam memori, digunakan sebagai pangkalan data, cache, dan pesan. - https://redis.io/

OK, jadi itu berarti semuanya ada di memori. Maaf, drive SSD cepat ini tidak akan membantu Anda di sini. Redis dapat mempertahankan data ke disk, sehingga dapat dimuat ke dalam RAM setelah restart. Itu hanya untuk tidak "kehilangan" data atau harus mengisi ulang cache dingin setelah restart. Jadi dalam hal ini, Anda harus menggunakan RAM, apa pun yang terjadi. Anda harus memiliki RAM yang cukup untuk memuat kumpulan data Anda. Tidak cukup RAM dan saya kira OS Anda akan digunakan swap- mungkin bukan ide yang baik.

ETL
sumber
Terima kasih. Ini memang bermanfaat. Memang ada banyak variasi kontekstual di sini yang mempengaruhi ini. Jika kita mengabaikan beban berat untuk sesaat, tampaknya dari jawaban Anda bahwa memang, latensi jaringan adalah hambatan, jadi latensi tambahan SSD vs RAM tidak cukup berarti. Tetapi sekarang, jika kita memperhitungkan beban berat, perbedaan latensi SSD relatif terhadap RAM mulai bertambah, dan sekarang, RAM akan bersinar. Apakah ini yang terjadi kemudian?
Neeraj Murarka
1
Sulit untuk merebusnya menjadi satu faktor beban berat. Tapi ya, jika Anda memiliki operasi tunggal, latensi jaringan sedemikian rupa sehingga Anda mungkin tidak akan melihat perbedaan SSD vs RAM. Sama seperti sampai disk 12Gbps muncul di pasaran, tautan jaringan 10Gbps tidak akan kelebihan beban oleh satu aliran karena disk adalah hambatannya. Tetapi ingat bahwa disk Anda melakukan banyak hal lain, proses Anda bukan satu-satunya proses pada mesin, dll.
ETL
1
Perhatikan juga bahwa ada banyak faktor lain yang perlu dipertimbangkan selain latensi, khususnya bahwa sebagian besar layanan nyata perlu menjalankan beberapa contoh program server pada mesin yang berbeda, jadi "semuanya dalam RAM secara lokal" biasanya bukan pilihan praktis sama sekali.
chrylis -pada mogok-
Tetapi link jaringan 10g adalah low-end. Server saya terhubung ke tulang punggung saya dengan 200gigabit (ya, tautan 2x100g).
TomTom
3

Ada banyak lapisan cache di sistem komputer. Memasukkan satu di lapisan aplikasi dapat bermanfaat, caching API dan permintaan basis data. Dan mungkin data sementara seperti sesi pengguna.

Menyimpan data seperti Redis menyediakan layanan seperti itu melalui jaringan (cepat) atau soket UNIX (bahkan lebih cepat), seperti halnya Anda akan menggunakan database.

Anda perlu mengukur kinerja aplikasi Anda, tetapi mari kita buat contoh. Katakanlah permintaan pengguna umum melakukan 5 permintaan API yang masing-masing mengambil 50 ms. 250 ms adalah latensi yang dapat dideteksi pengguna. Kontras dengan caching hasilnya. Bahkan jika cache berada di zona ketersediaan berbeda di seluruh kota (tidak optimal), hit mungkin paling banyak 10 ms. Yang akan menjadi speedup 5x.

Pada kenyataannya, basis data dan sistem penyimpanan memiliki cache sendiri juga. Namun, biasanya lebih cepat untuk mendapatkan hasil yang telah diambil sebelumnya daripada melalui mesin basis data dan lapisan sistem penyimpanan lagi. Juga, lapisan caching dapat mengambil beban signifikan dari database di belakangnya.

Untuk contoh cache yang demikian dalam produksi, tidak terlihat lagi dari blog infrastruktur Stack Overflow pada arsitektur . Ratusan ribu permintaan HTTP yang menghasilkan milyaran hit Redis cukup signifikan.

Memori itu mahal.

DRAM pada waktu akses 100 ns kira-kira 100x lebih cepat daripada penyimpanan permanen solid state. Ini relatif murah untuk kinerja ini. Untuk banyak aplikasi, sedikit lebih banyak RAM membeli kecepatan dan waktu respons yang berharga.

John Mahowald
sumber
Bisakah Anda menjelaskan bagaimana Anda menghitung bahwa masing-masing dari 5 kueri API tersebut masing-masing mengambil 50 ms? Apakah itu dengan kedok aplikasi memukul database dan melakukan query dan menghitung set hasil, vs hanya memukul cache di seluruh kota yang kebetulan telah cache string permintaan itu sendiri sebagai kunci, dan memiliki salinan cache hasil itu set?
Neeraj Murarka
1
Saya membuat angka-angka itu, tapi ya. Melakukan kueri dan menghitung hasil lagi kemungkinan akan lebih lambat daripada mendapatkan hasil yang dihitung sebelumnya. Implementasi seperti Redis cenderung di-memori untuk kesederhanaan dan kecepatan. Melintasi jaringan IP atau transportasi soket UNIX juga bisa sangat cepat. Semua yang dikatakan, barang caching ini tidak diperlukan untuk setiap desain.
John Mahowald
Dimengerti. Saya pikir saya kurang lebih mengerti. Tampaknya dalam banyak kasus, tetapi tidak sepanjang waktu, bahkan melintasi pusat data ke cache terdekat yang mungkin berada di negara bagian AS yang sama (atau provinsi Kanada, dll.) (Mungkin kawasan adalah semantik yang baik) sering kali dapat menjadi keuntungan besar atas proses yang mencoba menghitung kembali nilai secara algoritmik dari database lokalnya sendiri, jika ternyata menghasilkan cache hit. Tapi kemudian, cache yang mungkin duduk jauh tidak menawarkan banyak nilai dengan menjadi di memori. Mungkin juga berbasis SSD.
Neeraj Murarka
1
Pusat data jarak jauh adalah kasus terburuk, idealnya tingkat cache kurang dari 1 ms dari kliennya. Mungkin zona ketersediaan yang sama, atau bahkan pada host yang sama. Anda bisa melakukan cache ke penyimpanan persisten jika Anda mau. Atau, Anda bisa menggunakan penyimpanan solid state untuk database utama, mempercepat semua permintaan, dan mungkin tidak memerlukan tingkat caching. Ada beberapa kemungkinan desain.
John Mahowald