RRD_PDPCALC(1) rrdtool RRD_PDPCALC(1)

rrd_pdpcalc - منطق محاسبات درونی PDP همراه با یک مثال از Tianpeng Xia

این مقاله نحوه محاسبه PDP را به روشی مفصل و در عین حال قابل فهم، همراه با یک مثال توضیح می‌دهد.

اگر آموزش‌ها یا صفحات راهنما (man pages) را در وبگاه رسمی یا نوشته‌های دیگران مطالعه نکرده‌اید، اکیداً پیشنهاد می‌کنم این کار را انجام دهید. همان‌طور که در توضیحات گفته شد، این مقاله صرفاً نحوه محاسبه یک PDP را توضیح می‌دهد و نه تعریف آن را. بنابراین لطفاً مطالب زیر را بخوانید تا درک اولیه‌ای از PDP به دست آورید:

http://rrdtool.vandenbogaerdt.nl/process.php - نوشته Alex van den Bogaerdt. این مقاله PDP را به شکلی بسیار مفصل و شفاف توضیح داده است، با این حال، «فرایند نرمال‌سازی» را در بخش «Normalize interval» به روش درستی توضیح نمی‌دهد (بر خلاف نسخه رسمی که من شخصاً با خود @oetiker تأیید کردم). این نقص را می‌توان به راحتی در نمودارهای میله‌ای که در بخش «منطق‌های محاسباتی» مورد بحث قرار گرفته است مشاهده کرد.

https://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html - این مورد در وبگاه رسمی قرار دارد. در واقع این صفحه راهنما برای «rrdcreate» است و آنچه در پشت صحنه در ارتباط با محاسبه PDP رخ می‌دهد را در بخش «The HEARTBEAT and the STEP» آشکار می‌سازد.

نمودار متنی Don Baarda توضیح روشنی در مورد نحوه تولید داده‌های UNKNOWN و نحوه تأثیر مقدار heartbeat بر نمونه‌برداری ارائه می‌دهد. متأسفانه این نمودار روش شفافی برای نحوه محاسبه PDPها ارائه نمی‌کند.

https://oss.oetiker.ch/rrdtool/tut/rrdtutorial.en.html - یک آموزش رسمی و مفصل دیگر توسط Alex van den Bogaerdt. به طور مشابه، این آموزش فقط مثال‌هایی با داده‌های توزیع‌شده به صورت یکنواخت و دقیق طبق step تعیین‌شده ارائه می‌دهد.

اگر تمایلی به انجام آزمایش ندارید یا چندان به سازوکار درونی آن اهمیت نمی‌دهید، می‌توانید همین‌جا متوقف شوید و به موضوعات کاربردی‌تر مانند صدور نمودارها یا راهنمای دستورها توجه کنید. اما اگر از آن دسته افرادی مانند من هستید که به همان اندازه به منطق‌های محاسباتی اهمیت می‌دهید، لطفاً به خواندن ادامه دهید.

اینجا بخش اصلی این مقاله آغاز می‌شود. در ادامه این بخش، مایلم دو نسخه از روش‌های محاسبه را ارائه دهم، یکی توسط Alex van den Bogaerdt و دیگری توسط @eotiker.

برای ارائه توضیحی مناسب با نویسه‌های اسکی (ASCII)، هر دو نسخه را با نمودار زیر به جای یک تصویر واقعی توضیح خواهم داد.

 |
 |    (v1)
 | _______                        (v4)  (v5)
 | |     |           (v3)        ____________
 | |     |        ______________|     ||   |
 | |     |        |            ||     ||   |
 | |     |        |            ||     ||   |
 | |     |   (v2) |            ||     ||   |
 | |     |________|            ||     ||   |
--------------------------------------------->
 0 1     3        7            17     20   21

محور X نشان‌دهنده بازه‌های زمانی (هر ثانیه نشان‌دهنده یک بازه است) و محور Y نشان‌دهنده مقدار است.

بیایید همه‌چیز را کمی واضح‌تر کنیم:

- مقدار step برابر با ۵ است

- هر PDP تنها در صورتی به‌روزرسانی می‌شود که مقداری در آخرین بازهٔ PDP یا پس از آن دریافت شود؛ برای نمونه، آخرین بازهٔ PDP از ۱۶ تا ۲۰، عدد ۲۰ است

- مقدار heartbeat برابر با ۲۰ است، بنابراین نمونه‌های کل دوره ۷-۱۷ نادیده گرفته نمی‌شوند

- در ثانیه ۳، اولین مقدار با عنوان v1 وارد می‌شود و به همین ترتیب

- ثانیه ۰ مبدأ است و به عنوان یک نمونه به شمار نمی‌آید

همان‌طور که در این صفحه دیده می‌شود: http://rrdtool.vandenbogaerdt.nl/process.php، پس از این‌که تمام داده‌های اولیه به نرخ تبدیل شدند (البته به جز GAUGE)، به گفته نویسنده در صورتی که دقیقاً بر اساس step یا در مرزهای زمانیِ به خوبی تعریف‌شده توزیع نشده باشند، باید از یک فرایند نرمال‌سازی (normalization process) عبور کنند.

این به چه معناست؟ اساساً اگر تمام داده‌های شناخته‌شده (known) (در مقابل یک مقدار ناشناخته (unknown)) حداقل ۵۰٪ از تمام بازه‌ها را در طول یک دوره تشکیل دهند، یک PDP بر اساس آن‌ها محاسبه می‌شود.

به نظر می‌رسد این نسخه تا رسیدن به بخش نمودار میله‌ای به خوبی پیش می‌رود.

طبق نمودار میله‌ای اسکی، نتایج زیر حاصل می‌شود:

از ثانیه ۱ به بعد، مقدار PDP هر دوره (۱-۵، ۶-۱۰، ...) با میانگین‌گیری از تمام مقادیر موجود در آن محاسبه می‌شود.

بنابراین: - مقدار PDP از ۱ تا ۵ برابر است با (v1*3+v2*2)/5

- مقدار PDP از ۶ تا ۱۰ برابر است با (v2*2+v3*3)/5

- مقدار PDP از ۱۱ تا ۱۵ برابر است با (v3*5)/5، زیرا تمام مقادیر در بازه‌های ۱۱، ۱۲، ۱۳، ۱۴ و ۱۵ یکسان بوده و برابر با v3 هستند

- ...

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

- مقدار PDP از ۱ تا ۵ برابر است با (v1*3+v2*2)/5

- مقادیر PDP از ۶ تا ۱۰ و ۱۱ تا ۱۵ یکسان (SAME) هستند که برابر است با (v2*2+v3*8)

- ...

بنابراین ما این دو نسخه را دیدیم که مقادیر PDP آن‌ها از ۶ تا ۱۰ و ۱۱ تا ۱۵ با یکدیگر همخوانی ندارند.

چرا چنین است؟

زیرا تفاوت بین نسخه رسمی و نسخه Bogaerdt از شیوه محاسبه آن‌ها برای PDP(6-10) و PDP(11-15) ناشی می‌شود.

بیایید با استفاده از نمودار میله‌ای بالا با جزئیات بیشتری درباره این موضوع بحث کنیم.

نسخه Bogaerdt،

مقادیر PDP همیشه به صورت مجزا محاسبه می‌شوند، فارغ از اینکه مقادیر چگونه دریافت شوند.

برای مثال، مقدار موجود در بازه ۱۷ پس از آخرین بازهٔ PDP(11-15) می‌آید. همچنین، مقدار بلافاصله قبلی پیش از بازه ۱۷ در ۷ قرار دارد. به تمام بازه‌های ۷ تا ۱۷ مقدار v3 اختصاص داده شده است. از آنجا که هر PDP به صورت مجزا محاسبه می‌شود، مقدار PDP(6-10) برابر با (v2*2+v3*3)/5 است در حالی که PDP(11-15) برابر با (v3*5)/5 خواهد بود.

نسخه رسمی

مقادیر PDP همیشه بر اساس گام‌هایی (steps) محاسبه می‌شوند که به‌روزرسانی بعدی در بر می‌گیرد، چه ۱ گام باشد، چه ۲ گام یا n گام؛ به عبارت دیگر، ممکن است PDPها با هم محاسبه شوند.

برای نمونه، به‌روزرسانی در بازه ۱۷ هر دو دوره PDP(6-10) و PDP(11-15) را در بر می‌گیرد، زیرا مقدار بلافاصله قبلی در ۷ قرار دارد و ۷ بین ۶ و ۱۰ است، و ۱۷ پس از ۱۵ قرار دارد. دوره‌های PDP(1-5) و PDP(16-20) در آن گنجانده نمی‌شوند زیرا به‌روزرسانی در بازه ۷ پیش‌تر محاسبه برای PDP(1-5) را فعال کرده است و به‌روزرسانی در بازه ۱۷ پیش از آخرین بازهٔ PDP(16-20) یعنی ۲۰ می‌آید.

به همین دلیل است که PDP(6-10) و PDP(11-15) دارای مقداری یکسان یعنی (v2*2+v3*8) هستند.

اگر هنوز سردرگم هستید، نگران نباشید؛ یک مثال برای کمک به شما در اینجا آورده شده است.

بیایید با چند دستور دست‌به‌کار شویم:

rrdtool create target.rrd --start 1000000000  --step 5 DS:mem:GAUGE:20:0:100 RRA:AVERAGE:0.5:1:10
rrdtool update target.rrd 1000000003:8 1000000006:1 1000000017:6 \
1000000020:7 1000000021:7 1000000022:4 \
1000000023:3 1000000036:1 1000000037:2 \
1000000038:3 1000000039:3 1000000042:5
rrdtool fetch target.rrd AVERAGE --start 1000000000 --end 1000000045

اساساً کدهای بالا شامل ۳ دستور است: create، update و fetch. ابتدا یک فایل rrd جدید ایجاد می‌کنیم، سپس مقداری داده به آن تزریق کرده و در نهایت تمام PDPها را از rrd واکشی می‌کنیم.

برای ارائه توضیحی دقیق، فرایند محاسبه هر یک از PDPها ارائه شده است.

در زیر خروجی دستورهای بالا آمده است:

1000000005: 5.2000000000e+00
1000000010: 5.5000000000e+00
1000000015: 5.5000000000e+00
1000000020: 6.6000000000e+00
1000000025: 1.7333333333e+00
1000000030: 1.7333333333e+00
1000000035: 1.7333333333e+00
1000000040: 2.8000000000e+00
1000000045: nan
1000000050: nan

نکته: عدد 1000000005 به معنای PDP از 1000000001 تا 1000000005 است و به همین ترتیب. برای اختصار و خوانایی بهتر، فقط از دو رقم آخر استفاده می‌کنیم، بنابراین 05 نشان‌دهنده 1000000005 است. ما نوع منبع داده (data source) را gauge انتخاب می‌کنیم زیرا مقادیر اولیه به عنوان نرخ در نظر گرفته می‌شوند و به تبدیل اضافی نیازی نیست؛ برای جزئیات بیشتر به این مقاله http://rrdtool.vandenbogaerdt.nl/process.php مراجعه کنید.

05: 5.2 = (8*3+1*2)/5

10: 5.5 = (1*1+6*9)/10

15: مشابه مورد قبلی

20: 6.6 = (6*2+7*3)/5

25: 1.73333 = (7+4+3+1*12)/15

...

45: nan، چرا که آخرین مقدار در ۴۲ قرار دارد که باعث فعال شدن محاسبه برای PDP(41-45) نمی‌شود

50: nan، دلیل اینکه چرا این PDP ناشناخته نمایش داده می‌شود در این مقاله توضیح داده شده است: https://oss.oetiker.ch/rrdtool/tut/rrdtutorial.en.html

با همه این گفته‌ها، امیدوارم درک روشنی از «جادوی» محاسبات درونی PDPها به دست آورده باشید.

2026-08-08 1.11.0