Tanya Jawab Umum manajemen Azure Cache for Redis

Artikel ini menyediakan jawaban atas pertanyaan umum tentang cara mengelola Azure Cache for Redis.

Kapan saya harus mengaktifkan port non-TLS/SSL untuk menyambungkan ke Redis?

Server Redis secara default tidak mendukung TLS, tetapi Azure Cache for Redis mendukung. Jika ingin menyambungkan ke Azure Cache for Redis dan klien mendukung TLS, seperti StackExchange.Redis, Anda harus menggunakan TLS.

Catatan

Port non-TLS dinonaktifkan secara default untuk instans Azure Cache for Redis baru. Jika klien Anda tidak mendukung TLS, maka Anda harus mengaktifkan port non-TLS dengan mengikuti petunjuk di bagian Port akses dari artikel Konfigurasi cache di Azure Cache for Redis.

Alat Redis seperti redis-cli tidak dapat digunakan dengan port TLS, tetapi Anda dapat menggunakan utilitas seperti stunnel untuk menyambungkan alat dengan aman ke port TLS dengan mengikuti petunjuk dalam postingan blog Mengumumkan Penyedia Keadaan Sesi ASP.NET untuk Redis Rilis Pratinjau.

Untuk instruksi tentang mengunduh alat Redis, lihat bagian Bagaimana cara menjalankan perintah Redis?.

Apa saja praktik terbaik produksi?

Praktik terbaik StackExchange.Redis

  • Atur AbortConnect ke false, lalu biarkan ConnectionMultiplexer tersambung kembali secara otomatis.
  • Gunakan satu instans berumur ConnectionMultiplexer panjang daripada membuat koneksi baru untuk setiap permintaan. Untuk contoh cara mengelola koneksi, lihat RedisConnection kelas di Koneksi ke cache dengan Redisconnection.
  • Redis bekerja paling baik dengan nilai yang lebih kecil, jadi pertimbangkan untuk memotong data yang lebih besar menjadi beberapa kunci. Dalam diskusi Redis ini, 100 KB dianggap besar. Untuk informasi selengkapnya, lihat Pengembangan praktik terbaik.
  • Konfigurasikan pengaturan ThreadPool Anda untuk menghindari kehabisan waktu.
  • Gunakan minimal connectTimeout default 5 detik. Interval ini memberi StackExchange.Redis waktu yang cukup untuk membuat ulang sambungan jika terjadi blip jaringan.
  • Perhatikan biaya performa terkait setiap operasi yang Anda jalankan. Misalnya, perintah KEYS adalah operasi O(n) dan harus dihindari. Situs redis.io memiliki detail seputar kompleksitas waktu untuk setiap operasi yang didukungnya. Pilih setiap perintah untuk melihat kompleksitas setiap operasi.

Konfigurasi dan konsep

  • Gunakan Tingkat Standar atau Premium untuk sistem produksi. Tingkat Dasar adalah sistem node tunggal tanpa replikasi data dan tanpa SLA. Selain itu, gunakan setidaknya cache C1. Cache C0 biasanya digunakan untuk skenario pengembangan/pengujian sederhana.
  • Ingat bahwa Redis adalah penyimpanan data Dalam Memori. Untuk informasi selengkapnya, lihat Memecahkan masalah kehilangan data di Azure Cache for Redis sehingga Anda mengetahui skenario di mana kehilangan data dapat terjadi.
  • Kembangkan sistem Anda sehingga dapat menangani blip koneksi yang disebabkan oleh patching dan failover.

Pengujian performa

  • Mulai dengan menggunakan redis-benchmark.exe untuk merasakan kemungkinan throughput sebelum menulis tes perf Anda sendiri. Karena redis-benchmark tidak mendukung TLS, Anda harus mengaktifkan port Non-TLS melalui portal Microsoft Azure sebelum melakukan pengujian. Misalnya, lihat Bagaimana cara saya menolok ukur dan menguji performa cache saya?
  • Klien komputer virtual yang digunakan untuk pengujian harus berada di wilayah yang sama dengan instans Azure Cache for Redis Anda.
  • Sebaiknya gunakan Dv2 VM Series untuk klien Anda karena mereka memiliki perangkat keras yang lebih baik dan seharusnya memberikan hasil terbaik.
  • Pastikan komputer klien yang Anda pilih memiliki kemampuan komputasi dan bandwidth setidaknya setara dengan cache yang Anda uji.
  • Aktifkan VRSS pada komputer klien jika Anda menggunakan Windows. Lihat selengkapnya di sini.
  • Instans Redis tingkat Premium memiliki latensi jaringan dan throughput yang lebih baik karena instans tersebut berjalan pada perangkat keras yang lebih baik untuk CPU dan Jaringan.

Apa saja pertimbangan saat menggunakan perintah Redis umum?

  • Hindari menggunakan perintah Redis tertentu yang membutuhkan waktu lama untuk diselesaikan, kecuali jika Anda sepenuhnya memahami hasil perintah ini. Misalnya, jangan menjalankan perintah KEYS dalam produksi. Tergantung pada jumlah kunci, ini bisa memerlukan waktu lama untuk dikembalikan. Redis adalah server berutas tunggal dan memproses perintah satu per satu. Jika Anda memiliki perintah lain yang dikeluarkan setelah KEYS, perintah tersebut tidak akan diproses hingga Redis memproses perintah KEYS. Situs redis.io memiliki detail seputar kompleksitas waktu untuk setiap operasi yang didukungnya. Pilih setiap perintah untuk melihat kompleksitas setiap operasi.
  • Ukuran kunci - haruskah saya menggunakan kunci/nilai kecil atau kunci/nilai besar? Ini tergantung skenarionya. Jika skenario Anda memerlukan kunci yang lebih besar, Anda dapat menyesuaikan ConnectionTimeout, lalu mencoba kembali nilai dan menyesuaikan logika coba lagi. Dari perspektif server Redis, nilai yang lebih kecil memberikan performa yang lebih baik.
  • Pertimbangan ini tidak berarti bahwa Anda tidak dapat menyimpan nilai yang lebih besar di Redis; Anda harus mengetahui pertimbangan berikut. Latensi akan lebih tinggi. Jika memiliki kumpulan data besar dan kecil, Anda dapat menggunakan beberapa instans ConnectionMultiplexer. Konfigurasikan masing-masing dengan set nilai batas waktu dan coba lagi yang berbeda, seperti yang dijelaskan di bagian sebelumnya Apa yang dilakukan opsi konfigurasi StackExchange.Redis.

Bagaimana cara saya menolok ukur dan menguji performa cache saya?

  • Aktifkan diagnostik cache sehingga Anda dapat memantau kesehatan cache Anda. Anda dapat melihat metrik di portal Microsoft Azure, dan Anda juga dapat mengunduh dan meninjaunya menggunakan alat pilihan Anda.
  • Anda bisa menggunakan redis-benchmark.exe memuat pengujian server Redis Anda.
  • Pastikan bahwa klien pengujian beban dan Azure Cache for Redis berada di wilayah yang sama.
  • Gunakan redis-cli.exe dan pantau cache menggunakan perintah INFO.
  • Jika beban Anda menyebabkan pecahan memori tinggi, Anda harus meningkatkan skala hingga ukuran cache yang lebih besar.
  • Untuk instruksi tentang mengunduh alat Redis, lihat bagian Bagaimana cara menjalankan perintah Redis?.

Berikut adalah beberapa contoh penggunaan redis-benchmark.exe. Jalankan perintah ini dari komputer virtual di wilayah yang sama dengan cache Anda untuk hasil yang akurat.cache-development-faq.yml

  • Uji permintaan SET Dialurkan menggunakan payload 1k

    redis-benchmark.exe -h **yourcache**.redis.cache.windows.net -a **yourAccesskey** -t SET -n 1000000 -d 1024 -P 50

  • Uji permintaan GET Dialurkan menggunakan payload 1k.

Catatan

Jalankan uji SET yang ditunjukkan di atas terlebih dahulu untuk mengisi cache

redis-benchmark.exe -h **yourcache**.redis.cache.windows.net -a **yourAccesskey** -t GET -n 1000000 -d 1024 -P 50

Detail penting tentang pertumbuhan ThreadPool

CLR ThreadPool memiliki dua jenis utas - utas "Pekerja" dan "Port Penyelesaian I/O" (IOCP).

  • Utas pekerja digunakan untuk hal-hal seperti memproses Task.Run(…), atau metode ThreadPool.QueueUserWorkItem(…). Utas ini juga digunakan oleh berbagai komponen di CLR ketika pekerjaan perlu dilakukan pada utas latar belakang.
  • Utas IOCP digunakan ketika IO asinkron terjadi, seperti saat membaca dari jaringan.

Kumpulan utas menyediakan utas pekerja baru atau utas penyelesaian I/O sesuai permintaan (tanpa pembatasan) hingga mencapai pengaturan "Minimum" untuk setiap jenis utas. Secara default, jumlah minimum utas diatur ke jumlah prosesor pada sistem.

Setelah jumlah utas yang ada (sibuk) mencapai jumlah utas "minimum", ThreadPool akan membatasi laju di mana akan menyuntikkan utas baru ke satu utas per 500 milidetik. Biasanya, jika terjadi ledakan pekerjaan di sistem Anda yang membutuhkan utas IOCP, itu akan memproses yang bekerja dengan cepat. Namun, jika ledakan pekerjaan melebihi pengaturan "Minimum" yang dikonfigurasi, akan terjadi keterlambatan dalam pemrosesan beberapa pekerjaan karena ThreadPool menunggu salah satu dari dua kemungkinan:

  • Utas yang ada menjadi bebas untuk memproses pekerjaan.
  • Tidak ada utas yang bebas untuk 500 ms, sehingga utas baru dibuat.

Pada dasarnya, ketika jumlah utas Sibuk lebih besar dari utas Min, mungkin Anda perlu mengganti penundaan 500 ms sebelum lalu lintas jaringan diproses oleh aplikasi. Selain itu, ketika utas yang ada tetap diam selama lebih dari 15 detik, utas tersebut akan dibersihkan, dan siklus pertumbuhan dan penyusutan ini dapat berulang.

Jika kita melihat contoh pesan kesalahan dari StackExchange.Redis (build 1.0.450 atau yang lebih baru), kita dapat melihat bahwa sekarang ia mencetak statistik ThreadPool. Lihat detail IOCP dan WORKER di bawah ini.

System.TimeoutException: Timeout performing GET MyKey, inst: 2, mgr: Inactive,
queue: 6, qu: 0, qs: 6, qc: 0, wr: 0, wq: 0, in: 0, ar: 0,
IOCP: (Busy=6,Free=994,Min=4,Max=1000),
WORKER: (Busy=3,Free=997,Min=4,Max=1000)

Dalam contoh sebelumnya, Anda dapat melihat bahwa terdapat enam utas sibuk pada utas IOCP dan sistem dikonfigurasi untuk mengizinkan empat utas minimum. Dalam hal ini, klien kemungkinan akan melihat dua penundaan 500-ms, karena 6 > 4.

Catatan

Perhatikan bahwa StackExchange.Redis dapat mencapai batas waktu jika pertumbuhan utas IOCP atau WORKER akan dibatasi.

Rekomendasi

Mengingat informasi ini, sebaiknya pelanggan menetapkan nilai konfigurasi minimum untuk utas IOCP dan PEKERJA ke sesuatu yang lebih besar dari nilai default. Kami tidak dapat memberikan panduan satu ukuran untuk semua tentang apa nilai ini, seharusnya karena nilai yang tepat untuk satu aplikasi kemungkinan akan terlalu tinggi atau rendah untuk aplikasi lain. Pengaturan ini juga dapat memengaruhi performa bagian lain dari aplikasi yang rumit, sehingga setiap pelanggan perlu menyesuaikan pengaturan ini dengan kebutuhan spesifik mereka. Tempat awal yang baik adalah 200 atau 300, lalu uji dan tweak sesuai kebutuhan.

Cara mengonfigurasi pengaturan ini:

  • Sebaiknya ubah pengaturan ini secara terprogram menggunakan metode ThreadPool.SetMinThreads (...) di global.asax.cs. Contohnya:

    private readonly int minThreads = 200;
    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        ThreadPool.SetMinThreads(minThreads, minThreads);
    }
    

    Catatan

    Nilai yang ditentukan oleh metode ini adalah pengaturan global, yang memengaruhi seluruh AppDomain. Misalnya, jika Anda memiliki komputer dengan 4 inti dan ingin mengatur minWorkerThreads dan minIoThreads ke 50 per CPU selama run-time, gunakan ThreadPool.SetMinThreads(200, 200).

  • Anda juga dapat menentukan pengaturan utas minimum dengan menggunakan pengaturan konfigurasi minIoThreads atau minWorkerThreads di bawah elemen <processModel> konfigurasi Machine.config. Machine.config biasanya berada di %SystemRoot%\Microsoft.NET\Framework\[versionNumber]\CONFIG\. Mengatur jumlah utas minimum dengan cara ini umumnya tidak disarankan karena ini adalah pengaturan Sistem luas.

    Catatan

    Nilai yang ditentukan dalam elemen konfigurasi ini adalah pengaturan per inti. Misalnya, jika Anda memiliki komputer 4-inti dan ingin pengaturan minIoThreads Anda menjadi 200 pada waktu proses, Anda harus menggunakan <processModel minIoThreads="50"/>.

Aktifkan GC server untuk mendapatkan lebih banyak throughput pada klien saat menggunakan StackExchange.Redis

Mengaktifkan GC server dapat mengoptimalkan klien dan memberikan performa dan throughput yang lebih baik saat menggunakan StackExchange.Redis. Untuk informasi selengkapnya tentang GC server dan cara mengaktifkannya, lihat artikel berikut ini:

Pertimbangan performa seputar sambungan

Setiap tingkat harga memiliki batasan yang berbeda untuk sambungan, memori, dan bandwidth klien. Sementara setiap ukuran cache memungkinkan hingga sejumlah koneksi tertentu, setiap koneksi ke Redis memiliki overhead yang terkait dengannya. Contoh overhead tersebut adalah penggunaan CPU dan memori sebagai hasil dari enkripsi TLS/SSL. Batas sambungan maksimum untuk ukuran cache tertentu mengasumsikan cache yang dimuat dengan ringan. Jika beban dari overhead sambungan ditambah beban dari operasi klien melebihi kapasitas untuk sistem, cache dapat mengalami masalah kapasitas bahkan jika Anda belum melebihi batas koneksi untuk ukuran cache saat ini.

Untuk informasi selengkapnya tentang batas sambungan yang berbeda untuk setiap tingkatan, lihat Harga Azure Cache for Redis. Untuk informasi selengkapnya tentang sambungan dan konfigurasi default lainnya, lihat Konfigurasi server Redis default.

Langkah berikutnya

Pelajari tentang Tanya Jawab Umum Azure Cache for Redis lainnya.