twemproxy (كسارة البندق) تدهور الأداء مع .صافي ServiceStack.رديس العميل

StackOverflow https://stackoverflow.com//questions/20014030

سؤال

الإعداد رديس و كسارة البندق على CentOS 6.4.و تحاول الاتصال باستخدام ServiceStack.رديس العميل.وجدت الأداء الرئيسية المسألة.

لاختبار اليسار فقط 1 رديس سبيل المثال

beta:
  listen: 0.0.0.0:22122
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  #timeout: 5000
  #server_retry_timeout: 2000
  #server_failure_limit: 3
  redis: true
  servers:
  #- 127.0.0.1:6379:1
   - 127.0.0.1:6380:1

في اختبار وحدة أحاول أن أرسل 100k سلاسل رديس عبر كسارة البندق.

[TestClass]
public class RedisProxyTest
{
    public string host = "192.168.56.112";
    //public int port = 6379;
    public int port = 22122;

    [TestMethod]
    public void TestMethod1()
    {
        var key = "l2";
        var count = 100000;
        using (var redisClient = new RedisClient(host, port))
        {
            var list = new List<string>();
            for (int i = 0; i < count; i++)
            {
                list.Add(Guid.NewGuid().ToString());
            }

            Utils.TimeLog("Remove", () => redisClient.Remove(key));

            Utils.TimeLog("AddRangeToList", () => redisClient.AddRangeToList(key, list));
        }

        using (var redisClient = new RedisClient(host, port))
        {
            redisClient.GetListCount(key);

            Utils.TimeLog("GetRangeFromList", () =>
            {
                var ret = redisClient.GetRangeFromList(key, count / 2, count - 1);
                Console.WriteLine(ret.Count);
            });
        }

    }
}

على القليلة الأولى يعمل بعد تشغيل كسارة البندق AddRangeToList يعمل مع 1-2 ثانية.ولكن مع تشغيل اللاحقة AddRangeToList انخفاض الأداء بشكل كبير من بضع دقائق حتى أكثر من 20 دقيقة (إذا كان لا مهلة تكوين).أنا لا يمكن إعادة إنتاج نفسه عند استخدام رديس مباشرة.أنا لم أحاول أي عميل آخر حتى الآن.أي أفكار لماذا ؟

هذا ما أراه في وحدة التحكم عن بعد وحدة تشغيل الاختبار:

Test Name:  TestMethod1
Test Outcome:   Passed  
Remove: 0.0331171
AddRangeToList: 806.8219166
50000
GetRangeFromList: 1.741737
هل كانت مفيدة؟

المحلول

إذا كسارة البندق هو proxing عشرات الآلاف من اتصالات أو إرسال متعدد الحصول على الطلب مع عدة آلاف من مفاتيح, يجب عليك استخدام mbuf حجم 512

الرابط التالي يتحدث عن كيفية تفسير mbuf الحجم ؟ - https://github.com/twitter/twemproxy/issues/141

كل اتصال العميل يستهلك واحد على الأقل mbuf.خدمة طلب نحتاج اتصالين (واحد من العميل إلى وكيل آخر من proxy server).لذلك نحن بحاجة اثنين mbufs.

أ fragmentable طلب مثل 'الحصول فو بار ', التي btw يحصل مجزأة إلى الحصول على فو ' و 'الحصول على شريط ' سوف تستهلك اثنين mbuf على طلب اثنين mbuf عن الاستجابة.لذلك fragmentable الطلب مع ن شظايا يحتاج N * 2 mbufs

الشيء الجيد حول mbuf هو أن الذاكرة يأتي من إعادة استخدام المسبح.مرة واحدة mbuf يتم تخصيص, فمن لم يتحرر ولكن فقط وضع مرة أخرى في إعادة استخدام المسبح.الشيء السيئ هو أن مرة واحدة mbuf يتم تخصيص فمن لم يتحرر منذ تحرير mbuf دائما يعود إلى إعادة استخدام المسبح https://github.com/twitter/twemproxy/blob/master/src/nc_mbuf.c#L23-L24 (وهذا يمكن أن تكون ثابتة عن طريق وضع عتبة المعلمة على إعادة استخدام المسبح)

لذا ، إذا كسارة البندق هو التعامل مع القول 1K اتصالات العميل 100 اتصالات الملقم, فإنه سوف تستهلك (كحد أقصى(1000, 100) * 2 * mbuf الحجم) الذاكرة mbuf.إذا افترضنا أن العملاء إرسال غير ضخه الطلب ، ثم مع الافتراضي mbuf-حجم 16K هذا في مجموع تستهلك 32M.

وعلاوة على ذلك, إذا كان في المتوسط كل الطلبات 10 أجزاء ، ثم استهلاك الذاكرة سيكون 320M.بدلا من التعامل مع 1K اتصالات العميل ، دعونا نقول كنت التعامل مع 10K ، ثم استهلاك الذاكرة سيكون 3.2 G.الآن بدلا من استخدام الافتراضي mbuf-حجم 16K كنت 512 بايت ، ثم استهلاك الذاكرة لنفس السيناريو سوف تنخفض إلى 1000 * 2 * 512 * 10 = 10M

هذا هو السبب ل 'عدد كبير من الاتصال الذي ترغب في اختيار قيمة صغيرة على mbuf الحجم مثل 512

نصائح أخرى

يبدو أن

يبدو أن المشكلة مرتبطة باستخدام ذاكرة عالية عند نقل كمية البيانات.

بشكل افتراضي SUTCRACKER تخصيص حجم المخزن المؤقت 16K لكل مفتاح.في حالتي ستكون 16k * 100000= 1.5GB .رأيت حوالي 2 جيجابايت الذروة عند مشاهدة عملية كسارة البندق.تم تحميل نظام التشغيل VM الخاص بي ولم يكن هناك ذاكرة كافية للتعامل مع تلك المستفيدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top