توفر هذه المقالة إجابات للأسئلة الشائعة حول كيفية إدارة ذاكرة التخزين المؤقت Azure لـ Redis.
مهم
أعلن Azure Cache for Redis عن الجدول الزمني للاستبعاد لجميع وحدات SKU. نوصي بنقل مثيلات Azure Cache for Redis الحالية إلى Azure Managed Redis في أقرب وقت ممكن.
لمزيد من التفاصيل حول التقاعد:
كيف يمكنني قياس أداء ذاكرة التخزين المؤقت واختبارها؟
- استخدمه
redis-benchmark.exeلتحميل اختبار خادم Redis الخاص بك. استخدمهredis-benchmark.exeللتعرف على الإنتاجية المحتملة قبل كتابة اختبارات الأداء الخاصة بك. - يستخدم
redis-cliلمراقبة ذاكرة التخزين المؤقت باستخدامINFOالأمر. للحصول على إرشادات حول تنزيل أدوات Redis، راجع كيف يمكنني تشغيل أوامر Redis؟ - إذا كنت تستخدم Transport Layer Security/Secure Socket Layer (TLS/SSL) على مثيل ذاكرة التخزين المؤقت، فأضف المعلمة
--tlsإلى أوامر أدوات Redis، أو استخدم وكيلا مثلstunnelتمكين TLS/SSL. -
Redis-benchmarkيستخدم المنفذ6379افتراضيا. استخدم المعلمة-pلتجاوز هذا الإعداد إذا كانت ذاكرة التخزين المؤقت تستخدم منفذ6380SSL/TLS أو منفذ10000طبقة المؤسسة . - إذا لزم الأمر، يمكنك تمكين المنفذ غير TLS من خلال مدخل Microsoft Azure قبل تشغيل اختبار التحميل.
- تأكد من أن الجهاز الظاهري للعميل (VM) الذي تستخدمه للاختبار موجود في نفس المنطقة مثل مثيل Azure Cache for Redis.
- تأكد من أن الجهاز الظاهري للعميل لديه على الأقل نفس القدر من القدرة على الحوسبة والنطاق الترددي مثل ذاكرة التخزين المؤقت التي تختبرها. للحصول على أفضل النتائج، استخدم الأجهزة الظاهرية من السلسلة D والسلسلة E لعملائك.
- إذا كنت تستخدم Windows، فقم بتمكين التحجيم من جانب الاستلام الظاهري (VRSS) على جهاز العميل. لمزيد من المعلومات، راجع التحجيم الظاهري من جانب الاستلام في Windows Server 2012 R2.
- قم بتمكين تشخيصات ذاكرة التخزين المؤقت حتى تتمكن من مراقبة صحة ذاكرة التخزين المؤقت الخاصة بك. يمكنك عرض المقاييس في مدخل Microsoft Azure، ويمكنك أيضا تنزيل المقاييس ومراجعتها باستخدام الأدوات التي تختارها.
- إذا كان الحمل يتسبب في تجزئة الذاكرة العالية، فقم بتوسيع نطاقه إلى حجم ذاكرة التخزين المؤقت الأكبر.
توضح الأمثلة التالية كيفية استخدام redis-benchmark.exe. قم بتشغيل هذه الأوامر من جهاز ظاهري في نفس منطقة ذاكرة التخزين المؤقت للحصول على نتائج دقيقة.
أولا ، اختبار الطلبات التي تم ربط SET الأنابيب باستخدام حمولة 1k:
redis-benchmark.exe -h <yourcache>.redis.cache.windows.net -a <yourAccesskey> -t SET -n 1000000 -d 1024 -P 50
بعد تشغيل الاختبار SET ، قم بتشغيل الطلبات المعدة GET لمسارات باستخدام حمولة 1k:
redis-benchmark.exe -h <yourcache>.redis.cache.windows.net -a <yourAccesskey> -t GET -n 1000000 -d 1024 -P 50
كيف يمكنني تمكين خادم GC للحصول على المزيد من معدل النقل على العميل عند استخدام StackExchange.Redis؟
يمكن أن يؤدي تمكين جمع البيانات المهملة للخادم (GC) إلى تحسين العميل وتوفير أداء ومعدل نقل أفضل عند استخدام StackExchange.Redis. لمزيد من المعلومات حول الخادم GC وكيفية تمكينه، راجع المقالات التالية:
هل يجب أن أقوم بتمكين منفذ TLS / SSL للاتصال ب Redis؟
لا يدعم خادم Redis في الأصل أمان طبقة النقل (TLS)، لكن Azure Cache for Redis يدعم TLS. إذا قمت بالاتصال ب Azure Cache for Redis مع عميل مثل StackExchange.Redis يدعم TLS، فاستخدم TLS.
إشعار
يتم تعطيل المنفذ غير TLS بشكل افتراضي لمثيلات Azure Redis الجديدة. إذا كان عميلك لا يدعم طبقة النقل الآمنة، فقم بتمكين المنفذ غير التابع لطبقة النقل الآمنة باتباع الإرشادات في منافذ الوصول.
إذا كانت ذاكرة التخزين المؤقت تستخدم TLS، فيجب عليك تمكين TLS باستخدام --tls خيار أدوات Redis مثل redis-cli. يمكنك أيضا استخدام أداة مساعدة مثل stunnel توصيل الأدوات بمنفذ TLS بأمان باتباع الإرشادات الواردة في منشور مدونة إعلان موفر حالة جلسة ASP.NET ل Redis Preview Release .
للحصول على إرشادات حول تنزيل أدوات Redis، راجع كيف يمكنني تشغيل أوامر Redis؟
ما هي بعض الاعتبارات لاستخدام أوامر Redis الشائعة؟
تجنب استخدام أوامر Redis معينة تستغرق وقتًا طويلاً لإكمالها، إلا إذا كنت تفهم تمامًا نتيجة هذه الأوامر. على سبيل المثال، لا تقم بتشغيل الأمر KEYS في الإنتاج. اعتمادًا على عدد المفاتيح، قد يستغرق الأمر وقتًا طويلاً للعودة. Redis هو خادم أحادي الخيط يعالج الأوامر واحدا تلو الآخر. إذا قمت بإصدار الأمر
KEYS، فلن يعالج Redis الأوامر اللاحقة حتى ينتهي من معالجة الأمرKEYS.يحتوي موقع redis.io على تفاصيل التعقيد الزمني لكل عملية يدعمها. حدد كل أمر لمعرفة مدى تعقيد كل عملية.
يعتمد حجم المفاتيح المراد استخدامها على السيناريو. إذا كان السيناريو الخاص بك يتطلب مفاتيح أكبر، فيمكنك ضبط
ConnectionTimeoutقيم ، ثم إعادة المحاولة وضبط منطق إعادة المحاولة. من منظور خادم Redis ، توفر القيم الرئيسية الأصغر أداء أفضل.لا تعني هذه الاعتبارات أنه لا يمكنك تخزين قيم أكبر في Redis، ولكن زمن الانتقال أعلى. إذا كانت لديك مجموعة واحدة من البيانات أكبر من أخرى، فيمكنك استخدام مثيلات متعددة
ConnectionMultiplexer، تم تكوين كل منها بمجموعة مختلفة من قيم المهلة وإعادة المحاولة. لمزيد من المعلومات، راجع ماذا تفعل خيارات تكوين StackExchange.Redis؟
ما هي بعض اعتبارات الأداء للاتصالات؟
يحتوي كل مستوى تسعير Azure Cache for Redis على حدود مختلفة لاتصالات العميل والذاكرة والنطاق الترددي. في حين أن كل حجم من ذاكرة التخزين المؤقت يسمح بما يصل إلى عدد من الاتصالات ، فإن كل اتصال ب Redis يتضمن النفقات العامة المرتبطة. مثال على هذه النفقات العامة هو استخدام وحدة المعالجة المركزية والذاكرة بسبب تشفير TLS / SSL.
يفترض حد الاتصال الأقصى لحجم ذاكرة التخزين المؤقت المحدد وجود ذاكرة تخزين مؤقت محملة بشكل خفيف. إذا تجاوز الحمل من الحمل الزائد للاتصال بالإضافة إلى الحمل من عمليات العميل سعة النظام، فقد تواجه ذاكرة التخزين المؤقت مشكلات في السعة حتى إذا لم تتجاوز حد الاتصال لحجم ذاكرة التخزين المؤقت الحالي.
لمزيد من المعلومات حول حدود الاتصال لكل مستوى، راجع تسعير Azure Cache for Redis. لمزيد من المعلومات حول الاتصالات والتكوينات الافتراضية الأخرى، راجع التكوين الافتراضي لخادم Redis.
ما هي بعض أفضل ممارسات الإنتاج؟
- استخدم الطبقة القياسية أو المميزة لأنظمة الإنتاج. الطبقة الأساسية هي نظام عقدة واحدة بدون نسخ متماثل للبيانات ولا اتفاقية مستوى الخدمة (SLA). أيضا ، استخدم ذاكرة تخزين مؤقت C1 على الأقل للإنتاج. عادةً ما تُستخدم ذاكرات C0 المؤقتة لسيناريوهات التطوير / الاختبار البسيطة.
- اعلم أن Redis هو مخزن بيانات في الذاكرة ، ويمكن أن يحدث فقدان البيانات في بعض السيناريوهات. لمزيد من المعلومات، راجع استكشاف أخطاء فقدان البيانات وإصلاحها في Azure Cache for Redis.
- قم بتطوير نظامك حتى يتمكن من التعامل مع ومضات الاتصال الناتجة عن التصحيح وتجاوز الفشل.
- استخدم مثيلات Azure Redis من الطبقة المتميزة لتحسين زمن انتقال الشبكة ومعدل النقل، لأن لديهم أجهزة أفضل لكل من وحدة المعالجة المركزية والشبكة.
أفضل ممارسات StackExchange.Redis
- اضبط
AbortConnectعلى خطأ، ثم اتركConnectionMultiplexerإعادة الاتصال تلقائيا. - استخدم مثيلاً واحداً طويل المدة
ConnectionMultiplexerبدلاً من إنشاء اتصال جديد لكل طلب. - يعمل Redis بشكل أفضل مع القيم الأصغر، لذا ضع في اعتبارك تقطيع البيانات الأكبر إلى مفاتيح متعددة. على سبيل المثال ، في ما هو نطاق حجم القيمة المثالي ل redis؟، يعتبر 100 كيلو بايت كبيرا. لمزيد من المعلومات، راجع النظر في المزيد من المفاتيح والقيم الأصغر.
- قم بتكوين إعدادات ThreadPool لتجنب انتهاء المهلة.
- استخدم الإعداد الافتراضي
connectTimeout5 ثوان على الأقل. يمنح هذا الفاصل الزمني StackExchange.Redis وقتا كافيا لإعادة إنشاء الاتصال إذا كان هناك ومضة في الشبكة. - كن على دراية بتكاليف الأداء المرتبطة بالعمليات المختلفة التي تقوم بتشغيلها. على سبيل المثال، الأمر
KEYSهو عملية O (n) ويجب تجنبه. يحتوي موقع redis.io على تفاصيل حول التعقيد الزمني لكل عملية يدعمها. حدد كل أمر لمعرفة مدى تعقيد كل عملية.
تفاصيل مهمة حول نمو ThreadPool
يحتوي ThreadPool لوقت تشغيل اللغة الشائعة (CLR) على نوعين من مؤشرات الترابط، العامل ومنفذ إكمال الإدخال/الإخراج (IOCP).
-
WORKERتستخدم مؤشرات الترابط لأشياء مثل معالجةTask.Run(…)، أوThreadPool.QueueUserWorkItem(…)الأساليب. تستخدم المكونات المختلفة في CLR أيضا مؤشرات الترابط هذه عندما يحتاج العمل إلى حدوث في مؤشر ترابط خلفية. -
IOCPتستخدم مؤشرات الترابط للإدخال/الإخراج غير المتزامن، كما هو الحال عند القراءة من الشبكة.
يوفر تجمع مؤشرات الترابط مؤشرات ترابط عامل جديدة أو مؤشرات ترابط إكمال الإدخال/الإخراج عند الطلب دون أي تقييد حتى يصل إلى minimum الإعداد لكل نوع من مؤشرات الترابط. بشكل افتراضي، يتم تعيين الحد الأدنى لعدد مؤشرات الترابط على عدد المعالجات على النظام.
بمجرد أن يصل عدد مؤشرات الترابط المشغولة الموجودة إلى minimum رقم مؤشرات الترابط ، يقوم ThreadPool بخنق المعدل الذي يقوم به بحقن مؤشرات ترابط جديدة إلى مؤشر ترابط واحد لكل 500 مللي ثانية.
عادة ، إذا حصل نظامك على مجموعة من العمل الذي يحتاج إلى مؤشر IOCP ترابط ، فإنه يعالج ذلك العمل بسرعة. ومع ذلك، إذا كان الاندفاع أكثر من الإعداد الذي تم تكوينه minimum ، فهناك بعض التأخير في معالجة بعض العمل حيث ينتظر ThreadPool أحد الاحتمالين:
- يصبح مؤشر الترابط الموجود حرًا في معالجة العمل.
- لا يصبح أي مؤشر ترابط موجود مجانيا لمدة 500 مللي ثانية ، لذلك يتم إنشاء مؤشر ترابط جديد.
بشكل أساسي، عندما يكون عدد Busy مؤشرات الترابط أكبر من Min مؤشرات الترابط، فإنك تواجه تأخيرا قدره 500 مللي ثانية قبل أن يعالج التطبيق حركة مرور الشبكة. أيضا ، يتم تنظيف الخيط الموجود الذي يظل خاملا لمدة تزيد عن 15 ثانية ، ويمكن أن تتكرر دورة النمو والانكماش هذه.
رسائل الخطأ من StackExchange.Redis build 1.0.450 أو أحدث تطبع إحصائيات ThreadPool ، كما هو موضح في المثال التالي.
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)
يوضح المثال أنه بالنسبة لمؤشر IOCP الترابط، هناك ستة مؤشرات ترابط مشغولة وتم تكوين النظام للسماح بأربعة مؤشرات ترابط كحد أدنى. في هذه الحالة ، من المحتمل أن يرى العميل تأخيران لمدة 500 مللي ثانية ، لأن 6 > 4.
إشعار
يمكن أن يصل StackExchange.Redis إلى المهلات إذا تم تقييد نمو أي IOCP من مؤشرات WORKER الترابط.
من الأفضل تعيين الحد الأدنى لقيمة التكوين ومؤشرات IOCPWORKER الترابط إلى شيء أكبر من القيمة الافتراضية. لا توجد إرشادات واحدة تناسب الجميع حول هذه القيمة ، لأن القيمة المناسبة لتطبيق واحد من المحتمل أن تكون عالية جدا أو منخفضة بالنسبة لتطبيق آخر. يمكن أن يؤثر هذا الإعداد أيضا على أداء الأجزاء الأخرى من التطبيقات المعقدة. تحتاج إلى ضبط هذا الإعداد وفقا لاحتياجاتك الخاصة. مكان البداية الجيد هو 200 أو 300. ثم اختبر وقم بتعديله حسب الحاجة.
تكوين إعداد الحد الأدنى لمؤشرات الترابط
يمكنك تغيير هذا الإعداد برمجيا باستخدام طريقة ThreadPool.SetMinThreads (...).
على سبيل المثال، في NET Framework، يمكنك تعيين هذه القيمة في Global.asax.cs في Application_Start الطريقة:
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);
}
إذا كنت تستخدم .NET Core، فيمكنك تعيين القيمة في Program.cs قبل المكالمة مباشرة إلى WebApplication.CreateBuilder():
const int minThreads = 200
ThreadPool.SetMinThreads(minThreads, minThreads);
var builder = WebApplication.CreateBuilder(args);
// rest of application setup
إشعار
القيمة المحددة بواسطة هذه الطريقة هي إعداد عمومي يؤثر على AppDomain بأكمله. على سبيل المثال، إذا كان لديك جهاز ظاهري رباعي النواة وتريد تعيين minWorkerThreads و minIoThreads إلى 50 لكل وحدة معالجة مركزية أثناء وقت التشغيل، فاستخدم ThreadPool.SetMinThreads(200, 200).
من الممكن أيضا تحديد إعداد الحد الأدنى لمؤشرات الترابط باستخدام minIoThreadsminWorkerThreads أو ضمن <processModel> عنصر التكوين في Machine.config. يقع Machine.config عادة في %SystemRoot%\Microsoft.NET\Framework\versionNumber<>\CONFIG\.
لا يوصى بتعيين عدد الحد الأدنى لمؤشرات الترابط بهذه الطريقة لأنه إعداد على مستوى النظام. إذا قمت بتعيين الحد الأدنى من مؤشرات الترابط بهذه الطريقة، فيجب إعادة تشغيل تجمع التطبيقات.
إشعار
القيمة المحددة بواسطة هذه الطريقة هي إعداد لكل نواة . على سبيل المثال، إذا كان لديك جهاز رباعي النواة وتريد أن يكون الإعداد 200 minIoThreads في وقت التشغيل، فاستخدم <processModel minIoThreads="50">.