MEMASLAP(1) libmemcached-awesome MEMASLAP(1)

memaslap - ابزار تست بار و بنچ‌مارک کارایی سرورهای Memcached

memaslap [گزینه‌ها]

دستور memaslap یک ابزار تولید بار کاری و سنجش کارایی (بنچ‌مارک) برای سرورهای memcached است. این ابزار بارهای کاری قابل‌پیکربندی مانند تعداد نخ‌ها، همزمانی، تعداد اتصالات، مدت زمان اجرا، بازنویسی (overwrite)، نرخ خطا در کش (miss rate)، اندازه کلیدها، اندازه مقادیر، نسبت دستورات get/set، توان عملیاتی مورد انتظار (throughput) و موارد دیگر را تولید می‌کند. علاوه بر این، اعتبارسنجی داده‌ها، اعتبارسنجی زمان انقضا، پروتکل‌های UDP و باینری، آزمون فیس‌بوک (facebook test)، آزمون رونوشت‌برداری (replication)، درخواست‌های چندگانه (multi-get) و اتصال مجدد را نیز ارزیابی و تست می‌کند.

ابزار Memaslap اتصالات شبکه را همانند memcached با استفاده از libevent مدیریت می‌کند. هر نخ از memaslap به یک هسته پردازنده (CPU) مقید می‌شود، نخ‌ها هیچ ارتباطی با یکدیگر ندارند و درون هر نخ چندین اتصال سوکت وجود دارد. هر اتصال توزیع اندازه کلید، توزیع اندازه مقدار و توزیع دستورات را به صورت مستقل درون خود حفظ و مدیریت می‌کند.

می‌توانید سرورها را با گزینه memaslap --servers یا از طریق متغیر محیطی MEMCACHED_SERVERS <#envvar-MEMCACHED_SERVERS> مشخص کنید.

ابزار Memslap برای اهداف و با قابلیت‌های زیر توسعه یافته است:

مدیریت ناهمگام اتصالات شبکه به کمک libevent.

تنظیم هر دو پروتکل TCP و UDP برای استفاده از ورودی/خروجی غیرمسدودکننده (Non-blocking I/O).

بهبود موازی‌سازی: کارایی بالاتر در محیط‌های چندنخی.

بهبود بهره‌وری زمانی: سرعت پردازش بالاتر.

تولید بهینه‌تر کلیدها و مقادیر؛ توزیع اندازه کلید و اندازه مقدار قابل‌پیکربندی است.

پشتیبانی از دستورات get، multi-get و set؛ توزیع فراوانی دستورات قابل‌پیکربندی است.

پشتیبانی از نرخ خطای کش (miss rate) و نرخ بازنویسی (overwrite rate) قابل‌کنترل.

پشتیبانی از اعتبارسنجی داده‌ها و زمان انقضا.

پشتیبانی از تخلیه و ثبت دوره‌ای اطلاعات آماری.

پشتیبانی از هزاران اتصال همزمان TCP.

پشتیبانی از پروتکل باینری (دودویی).

پشتیبانی از آزمون فیس‌بوک (دستور set با TCP و multi-get با UDP) و آزمون رونوشت‌برداری (Replication).

در memaslap، هر دو پروتکل TCP و UDP از ورودی/خروجی شبکه غیرمسدودکننده استفاده می‌کنند. تمام رخدادهای شبکه مانند memcached توسط libevent مدیریت می‌شوند. ماژول شبکه memaslap مشابه memcached است. استفاده از libevent تضمین می‌کند که memaslap بتواند ترافیک شبکه را با بازدهی بسیار بالایی مدیریت کند.

ابزار Memslap پیاده‌سازی چندنخی مشابهی با memcached دارد. این ابزار یک یا چند نخ مستقل ایجاد می‌کند؛ اگر سیستم از تنظیم وابستگی هسته پردازنده (CPU core affinity) پشتیبانی کند، هر نخ به یک هسته اختصاصی متصل می‌شود.

علاوه بر این، هر نخ نمونه‌ای از libevent برای مدیریت رویدادهای شبکه دارد؛ هر نخ دارای یک یا چند تسک همزمانی خودگردان است و هر همزمانی دارای یک یا چند اتصال سوکت است. تمام تسک‌های همزمان، حتی اگر در یک نخ یکسان باشند، با یکدیگر ارتباط برقرار نمی‌کنند.

ابزار Memslap می‌تواند هزاران اتصال سوکت ایجاد کند و هر تسک همزمانی دارای ده‌ها اتصال سوکت است. هر همزمانی به صورت تصادفی یا ترتیبی یک اتصال سوکت را از استخر اتصالات خود انتخاب کرده و اجرا می‌کند؛ بنابراین memaslap تضمین می‌کند که هر همزمانی در هر لحظه مشخص فقط با یک اتصال سوکت کار کند. کاربران می‌توانند تعداد همزمانی‌ها و تعداد اتصالات سوکت هر همزمانی را متناسب با بار کاری مورد نظر خود تعیین کنند.

به منظور افزایش بهره‌وری زمانی و صرفه‌جویی در حافظه، memaslap یک جدول کاراکتر تصادفی با ۱۰ میلیون کاراکتر ایجاد می‌کند. تمام پسوندهای کلیدها و مقادیر از این جدول کاراکتر تصادفی تولید می‌شوند.

ابزار Memslap از آفست درون جدول کاراکتر و طول رشته برای شناسایی رشته‌ها استفاده می‌کند که این کار موجب صرفه‌جویی چشمگیر در مصرف حافظه می‌شود. هر کلید شامل دو بخش است: پیشوند و پسوند. پیشوند یک عدد uint64_t به اندازه ۸ بایت است. برای امکان اعتبارسنجی داده‌های قبلی، memaslap باید اطمینان حاصل کند که هر کلید یکتا است، بنابراین از این پیشوند برای شناسایی کلید استفاده می‌کند. پیشوند نباید شامل کاراکترهای غیرمجاز مانند 'r'، 'n'، '0' یا فاصله (' ') باشد؛ memaslap از الگوریتمی اختصاصی برای تضمین این امر بهره می‌برد.

ابزار Memslap در ابتدای کار تمام اشیا (جفت‌های کلید-مقدار) را یکجا تولید نمی‌کند، بلکه تنها به اندازه‌ای شیء ایجاد می‌کند که پنجره تسک (task window به طور پیش‌فرض ۱۰ هزار شیء) برای هر همزمانی پر شود. هر شیء دارای اطلاعات پایه‌ای شامل پیشوند کلید، آفست پسوند کلید در جدول کاراکتر، طول کلید، آفست مقدار در جدول کاراکتر و طول مقدار است.

در حین فرایند کار، هر تسک همزمانی به صورت ترتیبی یا تصادفی شیئی را از پنجره کاری انتخاب کرده و عملیات set یا get را روی آن انجام می‌دهد. همزمان، هر همزمانی اشیای قدیمی را از پنجره کاری خود خارج کرده و اشیای جدیدی جایگزین آن‌ها می‌کند.

ابزار Memslap از libevent برای زمان‌بندی تمام تسک‌های همزمان نخ‌ها استفاده می‌کند و هر همزمانی تسک‌ها را بر اساس پنجره محلی خود زمان‌بندی می‌نماید. فرضیه Memslap این است که اگر هر همزمانی توزیع کلید، توزیع مقدار و توزیع دستورات یکسانی را حفظ کند، از دید بیرونی، memaslap تمام توزیع‌ها را در مقیاس کلی حفظ خواهد کرد. هر پنجره کاری شامل اشیای متعددی است که هر شیء مشخصات پایه‌ای خود مانند کلید، مقدار، زمان انقضا و غیره را نگهداری می‌کند. در هر لحظه، تمام اشیای درون پنجره، توزیع ثابت و یکسانی از کلید و مقدار را حفظ می‌کنند. در صورت بازنویسی (overwrite) یک شیء، مقدار آن به‌روزرسانی می‌شود. Memslap صحت داده‌ها یا زمان انقضا را بر اساس اطلاعات ذخیره‌شده شیء در پنجره کاری اعتبارسنجی می‌کند.

کتابخانه libevent بر اساس رویداد شبکه مشخص، تعیین می‌کند کدام همزمانی پاسخگو باشد. سپس آن همزمانی بر اساس توزیع دستورات، دستور مورد نظر (get یا set) را برای اجرا برمی‌گزیند. اگر نیاز باشد شیء قدیمی حذف و شیء جدیدی اضافه گردد، به منظور حفظ ثبات توزیع کلید و مقدار، شیء جدید باید دقیقاً همان طول کلید و طول مقدار شیء قبلی را داشته باشد.

اگر سرور memcached دارای دو لایه کش (حافظه رم و SSD) باشد، اجرای memaslap با اندازه‌های مختلف پنجره کاری می‌تواند نرخ‌های مختلف خطای کش (miss rate) را شبیه‌سازی کند. اگر memaslap در ابتدا اشیای کافی به پنجره‌ها اضافه کند و حافظه کش اولیه memcached نتواند تمام اشیای مقداردهی‌شده را ذخیره کند، memaslap برخی اشیا را از لایه دوم کش فراخوانی خواهد کرد که این موضوع باعث miss در لایه اول می‌شود. بنابراین کاربر می‌تواند اندازه پنجره را طوری تنظیم کند که نرخ خطای مورد انتظار لایه اول کش شبیه‌سازی شود.

از آنجا که هر نخ به صورت خودگردان عمل می‌کند، memaslap می‌تواند نخ‌های مختلف را به سرورهای مختلف memcached اختصاص دهد. این تنها یکی از روش‌های آزمایش چند سرور همزمان در memaslap است. تنها محدودیت این است که تعداد سرورها نباید بیشتر از تعداد نخ‌ها باشد. روش دیگر برای آزمایش چند سرور، آزمون رونوشت‌برداری (Replication) است. هر همزمانی یک اتصال سوکت به هر سرور memcached دارد. در این پیاده‌سازی، memaslap می‌تواند برخی اشیا را روی یک سرور memcached ذخیره کرده (set) و همان اشیا را از سرورهای دیگر دریافت کند (get).

به طور پیش‌فرض، Memslap عملیات get تک‌موردی را اجرا می‌کند. اگر کاربر گزینه multi-get را فعال کند، memaslap تعداد کافی دستور get را جمع‌آوری کرده و آن‌ها را در قالب یک بسته مشترک ارسال می‌کند.

ابزار Memslap هم از پروتکل ASCII و هم پروتکل باینری (دودویی) پشتیبانی می‌کند، اما به طور پیش‌فرض روی پروتکل ASCII اجرا می‌شود. همچنین به طور پیش‌فرض از پروتکل TCP استفاده می‌کند ولی آزمون روی UDP را نیز پوشش می‌دهد. از آنجا که UDP غیرقابل‌اعتماد است، ممکن است ریزش بسته‌ها (packet loss) و بسته‌های خارج از ترتیب رخ دهد. Memslap یک بافر حافظه اختصاصی برای مدیریت این شرایط ایجاد می‌کند. این ابزار تلاش می‌کند تمام داده‌های پاسخ یک دستور را از سرور خوانده و آن‌ها را مرتب‌سازی مجدد کند. در صورت مفقود شدن بسته‌ها، سازوکار انقضای زمان انتظار (timeout) تضمین می‌کند بسته‌های ناقص دور ریخته شده و دستور بعدی ارسال گردد.

نمونه‌های استفاده از دستور:

memaslap -s 127.0.0.1:11211 -S 5s

memaslap -s 127.0.0.1:11211 -t 2m -v 0.2 -e 0.05 -b

memaslap -s 127.0.0.1:11211 -F config -t 2m -w 40k -S 20s -o 0.2

memaslap -s 127.0.0.1:11211 -F config -t 2m -T 4 -c 128 -d 20 -P 40k

memaslap -s 127.0.0.1:11211 -F config -t 2m -d 50 -a -n 40

memaslap -s 127.0.0.1:11211,127.0.0.1:11212 -F config -t 2m

memaslap -s 127.0.0.1:11211,127.0.0.1:11212 -F config -t 2m -p 2

برای اجرای memaslap کاربر باید حداقل یک سرور را مشخص کند. سایر پارامترها دارای مقادیر پیش‌فرض هستند که در جدول زیر آمده است:

تعداد نخ‌ها = 1 همزمانی = 16

مدت زمان اجرا = 600 ثانیه فایل پیکربندی = NULL

اندازه کلید = 64 اندازه مقدار = 1024

نسبت Get/set = 9:1 اندازه پنجره = 10k

تعداد اجرا = 0 دریافت تکی (Single get) = true

دریافت چندگانه (Multi-get) = false تعداد سوکت‌های هر همزمانی = 1

اتصال مجدد = false اعتبارسنجی داده‌ها = false

اعتبارسنجی زمان انقضا = false پروتکل ASCII = true

پروتکل باینری = false ثبت دوره‌ای اطلاعات آماری = false

نسبت بازنویسی = 0% پروتکل UDP = false

پروتکل TCP = true محدودیت توان عملیاتی = false

آزمون فیس‌بوک = false آزمون رونوشت‌برداری = false

تمامی توزیع‌ها از فایل پیکربندی مشخص‌شده توسط کاربر با گزینه "--cfg_cmd" خوانده می‌شوند. در صورتی که فایلی تعیین نشود، memaslap با مقادیر پیش‌فرض (اندازه کلید = ۶۴، اندازه مقدار = ۱۰۲۴ و نسبت get/set = 9:1) اجرا خواهد شد. برای مشاهده چگونگی ویرایش فایل، به بخش "فایل پیکربندی" مراجعه نمایید.

حداقل اندازه کلید ۱۶ بایت و حداکثر آن ۲۵۰ بایت است. دقت نسبت‌ها ۰.۰۰۱ است و درصد توزیع تا ۳ رقم اعشار گرد می‌شود.

حداقل اندازه مقدار ۱ بایت و حداکثر آن ۱ مگابایت است. دقت نسبت‌ها ۰.۰۰۱ است و درصد توزیع تا ۳ رقم اعشار گرد می‌شود. در حال حاضر memaslap تنها دستورات set و get را ارزیابی می‌کند و توانایی تست ۱۰۰٪ دستورات set و ۱۰۰٪ دستورات get را دارد. در حالت ۱۰۰٪ get، ابتدا تعدادی شیء از پیش روی سرور مقداردهی می‌شوند.

کارایی بالای memaslap مدیون زمان‌بندی ویژه نخ‌ها و همزمانی‌ها است. تعیین تعداد مناسب آن‌ها اهمیت بسزایی دارد. تعداد پیش‌فرض نخ‌ها ۱ و تعداد پیش‌فرض همزمانی‌ها ۱۶ است. کاربر می‌تواند با گزینه‌های "--threads" و "--concurrency" این مقادیر را تنظیم کند.

اگر سیستم از تنظیم وابستگی پردازنده پشتیبانی کند و تعداد نخ‌های تعیین‌شده بیشتر از ۱ باشد، memaslap تلاش می‌کند هر نخ را به یک هسته پردازنده مجزا متصل نماید. بنابراین برای دستیابی به بالاترین کارایی، توصیه می‌شود تعداد نخ‌ها برابر با تعداد هسته‌های پردازنده تنظیم شود. تعداد نخ‌ها می‌تواند کمتر یا بیشتر از تعداد هسته‌ها نیز باشد. با توجه به محدودیت‌های پیاده‌سازی، تعداد همزمانی‌ها باید مضربی از تعداد نخ‌ها باشد.

1.
برای سیستمی با ۸ هسته پردازنده:

برای مثال:

--threads=2 --concurrency=128

--threads=8 --concurrency=128

--threads=8 --concurrency=256

--threads=12 --concurrency=144

2.
برای سیستمی با ۱۶ هسته پردازنده:

برای مثال:

--threads=8 --concurrency=128

--threads=16 --concurrency=256

--threads=16 --concurrency=512

--threads=24 --concurrency=288

ابزار memaslap هنگام سنجش کارایی سرورهای memcached عملکرد بسیار بالایی از خود نشان می‌دهد. در اکثر مواقع گلوگاه اصلی پهنای باند شبکه یا خود سرور است. اگر به هر دلیلی نیاز به محدود کردن کارایی memaslap داشته باشید، دو راهکار وجود دارد:

کاهش تعداد نخ‌ها و همزمانی‌ها. استفاده از گزینه "--tps" که memaslap برای محدودسازی توان عملیاتی ارائه می‌دهد. این گزینه به کاربر امکان می‌دهد توان عملیاتی را روی میزانی معین ثابت نگه دارد. به عنوان مثال، اگر حداکثر توان ۵۰ هزار عملیات در ثانیه (kops/s) باشد، می‌توانید با این گزینه مقداری برابر یا کمتر از سقف توان را اعمال کنید.

در اغلب شرایط نیازی به تعیین دستی اندازه پنجره نیست. اندازه پیش‌فرض پنجره 10k است. برای Schooner Memcached کاربر می‌تواند اندازه‌های پنجره متفاوتی را متناسب با سناریوی آزمون جهت سنجش نرخ خطای کش بین ۰٪ تا ۱۰۰٪ تعیین کند. فرمول محاسبه اندازه پنجره به صورت زیر است:

فرض کنید اندازه کلید ۱۲۸ بایت، اندازه مقدار ۲۰۴۸ بایت و همزمانی ۱۲۸ باشد:

۱. برای کش کوچک (cache_size=1M) با نرخ خطای ۱۰۰٪ (فراخوانی داده‌ها از SSD): win_size=10k

2.
برای کش با ظرفیت 4G:

(۱) نرخ خطای کش ۰٪:

win_size=8k

(۲) نرخ خطای کش ۵٪:

win_size=11k

3.
برای کش با ظرفیت 16G:

(۱) نرخ خطای کش ۰٪:

win_size=32k

(۲) نرخ خطای کش ۵٪:

win_size=46k

فرمول محاسبه اندازه پنجره برای نرخ خطای ۰٪:

cache_size / concurrency / (key_size + value_size) * 0.5

فرمول محاسبه اندازه پنجره برای نرخ خطای ۵٪:

cache_size / concurrency / (key_size + value_size) * 0.7

ابزار Memslap از اعتبارسنجی صحت داده‌ها و زمان انقضا پشتیبانی می‌کند. کاربر می‌تواند از "--verify=" یا "-v" برای تعیین نسبت اعتبارسنجی داده‌ها استفاده کند (از نظر تئوری تا ۱۰۰٪ اعتبارسنجی داده‌ها). همچنین با "--exp_verify=" یا "-e" می‌توان نسبت اعتبارسنجی زمان انقضا را مشخص کرد. با فعال کردن گزینه "--verbose" جزئیات خطاهای اعتبارسنجی نمایش داده می‌شود.

برای مثال: --exp_verify=0.01 --verify=0.1 به این معنی است که ۱٪ اشیا با زمان انقضا ثبت می‌شوند و ۱۰٪ اشیای خوانده‌شده اعتبارسنجی خواهند شد. در صورت دریافت شیء، memaslap مقدار و زمان انقضای آن را بررسی و تایید می‌کند.

ابزار Memslap بر مبنای نخ‌های مستقل از چند سرور پشتیبانی می‌کند. محدودیت ساختاری این است که تعداد سرورها نمی‌تواند بیشتر از تعداد نخ‌ها باشد. Memslap حداقل یک نخ را به ازای هر سرور اختصاص می‌دهد. برای معرفی چندین سرور از گزینه "--servers=" یا "-s" استفاده کنید.

برای مثال:

--servers=10.1.1.1:11211,10.1.1.2:11212,10.1.1.3:11213 --threads=6 --concurrency=36

دستور فوق بدین معناست که ۶ نخ اجرا می‌شوند، هر نخ دارای ۶ تسک همزمانی است، نخ‌های ۰ و ۳ با سرور ۰ (10.1.1.1)، نخ‌های ۱ و ۴ با سرور ۱ (10.1.1.2) و نخ‌های ۲ و ۵ با سرور ۲ (10.1.1.3) ارتباط برقرار می‌کنند.

تمام نخ‌ها و همزمانی‌ها در memaslap مستقل و خودگردان هستند.

همچنین کاربر می‌تواند چندین نمونه مستقل از memaslap را اجرا کند. اجرای همزمان memaslap روی کلاینت‌های مختلف برای اتصال به یک سرور یکسان memcached امکان‌پذیر است؛ توصیه می‌شود نمونه‌های memaslap روی ماشین‌های مجزا با پیکربندی مشابه اجرا شوند.

به طور پیش‌فرض memaslap در حالت زمانی اجرا می‌شود و مدت زمان پیش‌فرض ۱۰ دقیقه است که با اتمام زمان، برنامه خاتمه می‌یابد. نباید هر دو حالت تعداد دستور و زمان را همزمان تعیین کنید، بلکه تنها یکی را انتخاب نمایید.

برای مثال:

--time=30s (اجرای تست به مدت ۳۰ ثانیه)

--execute_number=100000 (خروج از برنامه پس از اجرای ۱۰۰٬۰۰۰ دستور)

کاربر می‌تواند از "--stat_freq=" یا "-S" برای تنظیم تناوب ثبت آمار استفاده کند.

برای مثال:

--stat_freq=20s

ابزار Memslap هر ۲۰ ثانیه یک‌بار آمار دستورات get و set را چاپ می‌کند.

برای مشاهده جزئیات ساختار خروجی، بخش "فرمت خروجی" را ملاحظه کنید.

کاربر می‌تواند با "--division=" یا "-d" تعداد کلیدهای دریافت چندگانه (multi-get) در هر نوبت را مشخص کند. به طور پیش‌فرض، get تک‌موردی روی TCP انجام می‌شود. اعتبارسنجی داده‌ها و زمان انقضا برای multi-get نیز پشتیبانی می‌شود.

ابزار Memslap آزمون multi-get را روی هر دو پروتکل TCP و UDP پوشش می‌دهد. با توجه به تفاوت پیاده‌سازی پروتکل‌های ASCII و باینری: در پروتکل ASCII یک دستور "multi-get" ارسال می‌شود، در حالی که در پروتکل باینری چندین دستور تک‌موردی get به صورت تجمیعی تحت عنوان "multi-get" فرستاده می‌شوند.

ابزار Memslap از هر دو پروتکل UDP و TCP پشتیبانی می‌کند. در حالت TCP، در صورت قطع سوکت، memaslap به طور خودکار متصل نمی‌شود و در صورت قطعی تمام اتصالات یا کرش سرور، خارج خواهد شد؛ مگر اینکه گزینه "--reconnect" برای اتصال مجدد تنظیم شده باشد.

با گزینه "--udp" می‌توان حالت UDP را فعال کرد؛ با این حال UDP محدودیت‌های زیر را دارد:

حجم داده ارسالی با UDP نمی‌تواند بیشتر از ۱۴۰۰ بایت باشد.

پروتکل باینری از UDP پشتیبانی نمی‌کند زیرا پیاده‌سازی باینری memcached فاقد این قابلیت است.

پروتکل UDP از اتصال مجدد پشتیبانی نمی‌کند.

ثبت داده‌ها با TCP و دریافت چندگانه با UDP. برای فعال‌سازی از گزینه‌های زیر استفاده کنید:

"--facebook --division=50"

برای ایجاد هزاران اتصال TCP، گزینه زیر را تعیین کنید:

"--conn_sock="

برای مثال: --facebook --division=50 --conn_sock=200

دستور فوق بدین معناست که memaslap آزمون فیس‌بوک را اجرا می‌کند و هر همزمانی دارای ۲۰۰ اتصال سوکت TCP و یک سوکت UDP خواهد بود.

ابزار Memslap اشیا را با سوکت TCP ذخیره کرده و در هر نوبت ۵۰ شیء را با سوکت UDP به صورت چندگانه دریافت می‌کند.

در صورت تعیین "--division=50"، اندازه کلید باید کمتر از ۲۵ بایت باشد زیرا حداکثر اندازه بسته UDP برابر با ۱۴۰۰ بایت است.

برای این آزمون، کاربر باید حداقل دو سرور memcached را معرفی کند و با گزینه "--rep_write=" قابلیت را فعال نماید.

برای مثال:

--servers=10.1.1.1:11211,10.1.1.2:11212 --rep_write=2

دستور فوق بدین معناست که با ۲ سرور رونوشت، memaslap داده‌ها را روی هر دو سرور ذخیره کرده و داده‌های ثبت‌شده روی سرور ۰ را از سرور ۱، و داده‌های سرور ۱ را از سرور ۰ می‌خواند. در صورت خرابی سرور ۰، داده‌ها تنها از سرور ۱ خوانده می‌شوند و با بازگشت سرور ۰، اتصال به آن مجدداً برقرار می‌گردد. در صورت خرابی هر دو سرور، memaslap متوقف خواهد شد.

اجرای memaslap با گزینه "--conn_sock=" یا "-n" این قابلیت را فعال می‌کند. اطمینان حاصل کنید که سیستم عامل شما توانایی باز کردن هزاران فایل و ایجاد هزاران سوکت را دارد. این حالت در صورت قطعی سوکت‌ها از اتصال مجدد پشتیبانی نمی‌کند.

برای مثال:

--threads=8 --concurrency=128 --conn_sock=128

دستور فوق بدین معناست که memaslap با ۸ نخ اجرا می‌شود، هر نخ دارای ۱۶ همزمانی و هر همزمانی دارای ۱۲۸ اتصال سوکت TCP است که مجموع کل اتصالات به ۱۲۸ * ۱۲۸ = ۱۶۳۸۴ می‌رسد.

با گزینه "--binary" یا "-B" این ویژگی فعال می‌شود. تمامی قابلیت‌های فوق به جز UDP پشتیبانی می‌شوند (زیرا memcached از نسخه 1.3.3 پروتکل باینری UDP را پیاده‌سازی نکرده است).

برای مثال:

--binary

از آنجا که memcached پروتکل باینری UDP را پیاده‌سازی نکرده، memaslap از UDP در این حالت پشتیبانی نمی‌کند. علاوه بر این، در نسخه 1.3.3 دریافت چندگانه واقعی باینری وجود ندارد و در صورت استفاده از "--division=50"، ۵۰ دستور get تکی به صورت همزمان ارسال می‌شوند.

این بخش فرمت فایل پیکربندی را شرح می‌دهد. در صورتی که فایلی تعیین نشود، memaslap به طور پیش‌فرض فایل پیکربندی موجود در مسیر ‎~/.memaslap.cnf را می‌خواند.

نمونه‌ای از ساختار فایل پیکربندی در زیر آمده است:

---------------------------------------------------------------------------
#comments should start with '#'
#key
#start_len end_len proportion
#
#key length range from start_len to end_len
#start_len must be equal to or greater than 16
#end_len must be equal to or less than 250
#start_len must be equal to or greater than end_len
#memaslap will generate keys according to the key range
#proportion: indicates keys generated from one range accounts for the total
generated keys
#
#example1: key range 16~100 accounts for 80%
#          key range 101~200 accounts for 10%
#          key range 201~250 accounts for 10%
#          total should be 1 (0.8+0.1+0.1 = 1)
#
#          16 100 0.8
#          101 200 0.1
#          201 249 0.1
#
#example2: all keys length are 128 bytes
#
#          128 128 1
key
128 128 1
#value
#start_len end_len proportion
#
#value length range from start_len to end_len
#start_len must be equal to or greater than 1
#end_len must be equal to or less than 1M
#start_len must be equal to or greater than end_len
#memaslap will generate values according to the value range
#proportion: indicates values generated from one range accounts for the
total generated values
#
#example1: value range 1~1000 accounts for 80%
#          value range 1001~10000 accounts for 10%
#          value range 10001~100000 accounts for 10%
#          total should be 1 (0.8+0.1+0.1 = 1)
#
#          1 1000 0.8
#          1001 10000 0.1
#          10001 100000 0.1
#
#example2: all value length are 128 bytes
#
#          128 128 1
value
2048 2048 1
#cmd
#cmd_type cmd_proportion
#
#currently memaslap only testss get and set command.
#
#cmd_type
#set     0
#get     1
#
#example: set command accounts for 50%
#         get command accounts for 50%
#         total should be 1 (0.5+0.5 = 1)
#
#         cmd
#         0    0.5
#         1    0.5
cmd
0    0.1
1.0 0.9

در آغاز، memaslap برخی اطلاعات پیکربندی را به صورت زیر نمایش می‌دهد:

servers : 127.0.0.1:11211

threads count: 1

concurrency: 16

run time: 20s

windows size: 10k

set proportion: set_prop=0.10

get proportion: get_prop=0.90

servers

سرورهای استفاده‌شده توسط memaslap.

threads count

تعداد نخ‌های اجرایی memaslap.

concurrency

تعداد تسک‌های همزمانی فعال.

run time

مدت زمان کل اجرای آزمون.

windows size

اندازه پنجره کاری هر همزمانی.

set proportion

نسبت و سهم دستورات set.

get proportion

نسبت و سهم دستورات get.

خروجی آماری پویا به صورت زیر نمایش داده می‌شود:

---------------------------------------------------------------------------------------------------------------------------------
Get Statistics
Type  Time(s)  Ops   TPS(ops/s)  Net(M/s)  Get_miss  Min(us)  Max(us)
Avg(us)  Std_dev    Geo_dist
Period   5   345826  69165     65.3      0         27      2198     203
95.43      177.29
Global  20  1257935  62896     71.8      0         26      3791     224
117.79     192.60
Set Statistics
Type  Time(s)  Ops   TPS(ops/s)  Net(M/s)  Get_miss  Min(us)  Max(us)
Avg(us)  Std_dev    Geo_dist
Period   5    38425   7685      7.3       0         42      628     240
88.05      220.21
Global   20   139780  6989      8.0       0         37      3790    253
117.93     224.83
Total Statistics
Type  Time(s)  Ops   TPS(ops/s)  Net(M/s)  Get_miss  Min(us)  Max(us)
Avg(us)  Std_dev    Geo_dist
Period   5   384252   76850     72.5      0        27      2198     207
94.72      181.18
Global  20  1397720   69886     79.7      0        26      3791     227
117.93     195.60
---------------------------------------------------------------------------------------------------------------------------------

Get Statistics

اطلاعات آماری مربوط به دستورات get.

Set Statistics

اطلاعات آماری مربوط به دستورات set.

Total Statistics

اطلاعات آماری تجمیعی هر دو دستور get و set.

Period

نتایج مربوط به بازه زمانی اخیر.

Global

نتایج تجمیعی از آغاز اجرای آزمون.

Ops

تعداد کل عملیات‌های انجام‌شده.

TPS

توان عملیاتی بر حسب عملیات در ثانیه (Operations/Second).

Net

نرخ تبادل داده در شبکه بر حسب مگابایت بر ثانیه.

Get_miss

تعداد اشیایی که در کش یافت نشدند.

Min

حداقل زمان پاسخ‌دهی (میکروثانیه).

Max

حداکثر زمان پاسخ‌دهی (میکروثانیه).

Avg

میانگین زمان پاسخ‌دهی (میکروثانیه).

Std_dev

انحراف معیار زمان پاسخ‌دهی.

Geo_dist

توزیع هندسی بر مبنای تابع نمایی طبیعی.

در پایان آزمون، memaslap خروجی جامعی مشابه زیر تولید می‌کند:

---------------------------------------------------------------------------------------------------------------------------------
Get Statistics (1257956 events)
  Min:        26
  Max:      3791
  Avg:       224
  Geo:    192.60
  Std:    116.23
                  Log2 Dist:
                    4:        0       10    84490   215345
                    8:   484890   459823    12543      824
                   12:       31
 Set Statistics (139782 events)
    Min:        37
    Max:      3790
    Avg:       253
    Geo:    224.84
    Std:    116.83
    Log2 Dist:
      4:        0        0     4200 16988
      8:    50784    65574 2064      167
      12:        5
  Total Statistics (1397738 events)
      Min:        26
      Max:      3791
      Avg:       227
      Geo:    195.60
      Std:    116.60
      Log2 Dist:
        4:        0       10    88690   232333
        8:   535674   525397    14607      991
        12:       36
cmd_get: 1257969
cmd_set: 139785
get_misses: 0
verify_misses: 0
verify_failed: 0
expired_get: 0
unexpired_unget: 0
written_bytes: 242516030
read_bytes: 1003702556
object_bytes: 152086080
packet_disorder: 0
packet_drop: 0
udp_timeout: 0
Run time: 20.0s Ops: 1397754 TPS: 69817 Net_rate: 59.4M/s
---------------------------------------------------------------------------------------------------------------------------------

Get Statistics

آمار زمان پاسخ‌دهی دستورات get.

Set Statistics

آمار زمان پاسخ‌دهی دستورات set.

Total Statistics

آمار تجمیعی زمان پاسخ‌دهی هر دو دستور get و set.

Min

حداقل زمان پاسخ‌دهی ثبت‌شده.

Max

حداکثر زمان پاسخ‌دهی ثبت‌شده.

Avg

میانگین زمان پاسخ‌دهی در طول آزمون.

Std

انحراف معیار زمان پاسخ‌دهی.

Log2 Dist

توزیع هندسی بر مبنای لگاریتم ۲.

cmd_get

تعداد کل دستورات get انجام‌شده.

cmd_set

تعداد کل دستورات set انجام‌شده.

get_misses

تعداد اشیایی که از سرور دریافت نشدند (miss).

verify_misses

تعداد اشیایی که نیاز به اعتبارسنجی داشتند اما دریافت نشدند.

verify_failed

تعداد اشیایی که مقادیر آن‌ها نامعتبر یا مغایر بود.

expired_get

تعداد اشیایی که منقضی شده بودند اما همچنان دریافت شدند.

unexpired_unget

تعداد اشیایی که منقضی نشده بودند ولی دریافت نشدند.

written_bytes

مجموع بایت‌های نوشته‌شده روی سرور.

read_bytes

مجموع بایت‌های خوانده‌شده از سرور.

object_bytes

مجموع حجم کل اشیا بر حسب بایت.

packet_disorder

تعداد بسته‌های UDP که خارج از ترتیب دریافت شدند.

packet_drop

تعداد بسته‌های UDP از دست رفته (Drop).

udp_timeout

تعداد دفعات رخداد انقضای زمان انتظار در پروتکل UDP.

Run time

مدت زمان کل اجرای تست.

Ops

مجموع کل عملیات‌ها.

TPS

توان عملیاتی بر حسب عملیات در ثانیه.

Net_rate

میانگین نرخ تبادل شبکه.

فهرستی از یک یا چند سرور برای اتصال. تعداد سرورها باید کمتر یا مساوی تعداد نخ‌ها باشد. مثال: ‎--servers=localhost:1234,localhost:11211
تعداد نخ‌های اجرایی؛ ترجیحاً برابر با تعداد هسته‌های پردازنده تنظیم شود. پیش‌فرض 8.
تعداد تسک‌های همزمانی برای شبیه‌سازی بار کاری. پیش‌فرض 128.
تعداد سوکت‌های TCP به ازای هر همزمانی. پیش‌فرض 1.
تعداد کل عملیات‌ها (get و set) برای اجرای آزمون. پیش‌فرض 1000000.
مدت زمان اجرای آزمون با پسوندهای: s (ثانیه)، m (دقیقه)، h (ساعت)، d (روز). مثال: ‎--time=2h
بارگذاری فایل پیکربندی جهت دریافت توزیع دستورات، کلیدها و مقادیر.
اندازه پنجره تسک برای هر همزمانی با پسوندهای K یا M. مثال: ‎--win_size=10k. پیش‌فرض 10k.
اندازه ثابت و یکنواخت برای مقدارها (Value).
نسبت اعتبارسنجی داده‌ها. مثال: ‎--verify=0.01
تعداد کلیدها در هر بار دریافت چندگانه (multi-get). پیش‌فرض 1 به معنی دریافت تکی است.
تناوب زمانی تخلیه و ثبت اطلاعات آماری با پسوندهای: s (ثانیه)، m (دقیقه). مثال: ‎--stat_freq=10s
نسبت اشیای دارای زمان انقضا. مثال: ‎--exp_verify=0.01. پیش‌فرض بدون زمان انقضا.
نسبت اشیایی که نیاز به بازنویسی دارند. مثال: ‎--overwrite=0.01. پیش‌فرض ۰٪ (عدم بازنویسی).
آزمون اتصال مجدد؛ در صورت بسته شدن اتصال سوکت، مجدداً متصل می‌شود.
آزمون روی UDP؛ به طور پیش‌فرض از TCP استفاده می‌شود. پورت TCP و UDP سرور باید یکسان باشند.
فعال‌سازی آزمون فیس‌بوک (ذخیره با TCP و دریافت چندگانه با UDP).
فعال‌سازی پروتکل باینری (دودویی). به طور پیش‌فرض پروتکل ASCII استفاده می‌شود.
توان عملیاتی مورد انتظار با پسوند K. مثال: ‎--tps=10k
تعداد n سرور نخست که قابلیت نوشتن داده‌ها را دارند. مثال: ‎--rep_write=2
نمایش اطلاعات و جزئیات بیشتر در صورت شکست اعتبارسنجی.
نمایش پیام راهنما و خروج.
نمایش نسخه برنامه و خروج.

memaslap -s 127.0.0.1:11211 -S 5s

memaslap -s 127.0.0.1:11211 -t 2m -v 0.2 -e 0.05 -b

memaslap -s 127.0.0.1:11211 -F config -t 2m -w 40k -S 20s -o 0.2

memaslap -s 127.0.0.1:11211 -F config -t 2m -T 4 -c 128 -d 20 -P 40k

memaslap -s 127.0.0.1:11211 -F config -t 2m -d 50 -a -n 40

memaslap -s 127.0.0.1:11211,127.0.0.1:11212 -F config -t 2m

memaslap -s 127.0.0.1:11211,127.0.0.1:11212 -F config -t 2m -p 2

پیشوند این برنامه متغیر است؛ یعنی می‌تواند در زمان کامپایل و ساخت برنامه پیکربندی شود.

به طور معمول برنامه‌های کلاینت libmemcached-awesome دارای پیشوند mem هستند، مانند memcat یا memcp.

با این حال می‌توان آن را پیکربندی کرد تا پیشوند با چیز دیگری مانند mc جایگزین شود؛ در این صورت برنامه‌های کلاینت libmemcached-awesome به ترتیب mccat، mccp و غیره نامیده خواهند شد.

این یک برنامه مشارکتی (contributed) است.

این برنامه از ساختار و الگوی استاندارد فلگ‌ها/گزینه‌ها پیروی نمی‌کند.

memcached(1) https://linux.die.net/man/1/memcached، libmemcached(3) https://linux.die.net/man/3/libmemcached

March 7, 2026 1.1