عربيالفرنسيةالإسبانية

Ad


OnWorks فافيكون

cdeftutorial - عبر الإنترنت في السحابة

قم بتشغيل cdeftutorial في موفر الاستضافة المجاني OnWorks عبر Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت

هذا هو الأمر cdeftutorial الذي يمكن تشغيله في موفر الاستضافة المجاني OnWorks باستخدام إحدى محطات العمل المجانية المتعددة عبر الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت

برنامج:

اسم


cdeftutorial - البرنامج التعليمي لـ CDEF الخاص بـ Alex van den Bogaerdt

الوصف


الغرض من هذه الوثيقة: تقديم بعض الأمثلة على الأجزاء شائعة الاستخدام من
لغة CDEF الخاصة بـ RRDtool.

إذا كنت تعتقد أن بعض الميزات المهمة لم يتم شرحها بشكل صحيح، وإذا قمت بإضافتها إلى هذا
الوثيقة سوف تفيد معظم المستخدمين، من فضلك اطلب مني إضافتها. وسأحاول بعد ذلك تقديم
الإجابة في الإصدار التالي من هذا البرنامج التعليمي. عدم وجود ردود فعل يساوي عدم وجود تغييرات! الإضافات
إلى هذه الوثيقة هي موضع ترحيب أيضا. - أليكس فان دن بوجاردت[البريد الإلكتروني محمي]>

لماذا درس تعليمي؟
أحد الأجزاء القوية في RRDtool هو قدرته على إجراء جميع أنواع العمليات الحسابية على
البيانات المستردة من قواعد البيانات الخاصة بها. ومع ذلك، فإن خيارات RRDtool العديدة وتركيباتها تجعله كذلك
من الصعب على المستخدم العادي أن يفهم. الأدلة جيدة في شرح ما
هذه الخيارات تفعل؛ ومع ذلك، فهم لا (ولا ينبغي لهم) أن يشرحوا بالتفصيل سبب وجودهم
مفيد. كما هو الحال مع البرنامج التعليمي RRDtool الخاص بي: إذا كنت تريد مستندًا بسيطًا بلغة بسيطة، فيمكنك ذلك
يجب قراءة هذا البرنامج التعليمي. إذا كنت راضيًا عن الوثائق الرسمية، فقد تجد
هذه الوثيقة بسيطة جدًا أو حتى مملة. إذا اخترت قراءة هذا البرنامج التعليمي، فأنا أيضًا
أتوقع منك أن تقرأ وتفهم تمامًا برنامجي التعليمي الآخر.

المزيد قراءة
إذا كنت تواجه صعوبات في الطريقة التي أحاول بها شرح الأمر، فيرجى قراءة كتاب ستيف رادر
com.rpntutorial. قد يساعدك ذلك على فهم كيفية عمل كل هذا.

ابحث عن . CDEFs؟


عند استرداد البيانات من RRD، فإنك تستخدم "DEF" للتعامل مع تلك البيانات. افكر في
إنه متغير يتغير بمرور الوقت (حيث يكون الوقت هو المحور السيني). قيمة هذا
المتغير هو ما هو موجود في قاعدة البيانات في ذلك الوقت المحدد ولا يمكنك القيام بأي شيء
التعديلات عليه. هذا هو الغرض من CDEFs: فهي تأخذ القيم من DEFs وتؤديها
الحسابات عليها.

بناء الجملة


DEF:var_name_1=some.rrd:ds_name:CF
CDEF:var_name_2=RPN_expression

عليك أولاً تعريف "var_name_1" ليكون البيانات التي تم جمعها من مصدر البيانات "ds_name" الموجود في RRD
"some.rrd" مع وظيفة الدمج "CF".

افترض أنه تم حفظ عداد ifInOctets SNMP في mrtg.rrd كـ DS "in". ثم
يحدد DEF التالي متغيرًا لمتوسط ​​مصدر البيانات هذا:

DEF:inbytes=mrtg.rrd:in:AVERAGE

لنفترض أنك تريد عرض وحدات البت في الثانية (بدلاً من وحدات البايت في الثانية المخزنة في ملف
قاعدة البيانات.) يجب عليك تحديد عملية حسابية (ومن هنا "CDEF") على متغير "inbytes" واستخدامه
هذا المتغير (inbits) بدلاً من الأصل:

CDEF:البتات=البايتات,8,*

هذا يخبر RRDtool بضرب عدد البايتات في ثمانية للحصول على عدد البتات. سأشرح لاحقا كيف هذا
يعمل. في وظائف الرسم البياني أو الطباعة، يمكنك الآن استخدام وحدات البت التي ستستخدمها
بايت خلاف ذلك.

لاحظ أن اسم المتغير المستخدم في CDEF (inbits) يجب ألا يكون هو نفس المتغير
اسمه في DEF (بايت)!

تعبيرات RPN


RPN هو اختصار للتدوين البولندي العكسي. يعمل على النحو التالي. قمت بوضع المتغيرات
أو أرقام على المكدس. يمكنك أيضًا وضع العمليات (الأشياء التي يجب القيام بها) على المكدس وهذه المكدس
ثم تتم معالجتها. سيتم وضع النتيجة على المكدس. وفي النهاية يجب أن يكون هناك
بقي رقم واحد بالضبط: نتيجة سلسلة العمليات. إذا لم يكن هناك بالضبط
بقي رقم واحد، وسوف يشتكي RRDtool بصوت عال.

فوق الضرب في ثمانية سيبدو كما يلي:

1. ابدأ بمكدس فارغ

2. ضع محتوى البايتات المتغيرة على المكدس

3. ضع الرقم ثمانية على المكدس

4. ضع العملية المضاعفة على المكدس

5. معالجة المكدس

6. استخرج القيمة من المكدس وضعها في وحدات بت متغيرة

سنفعل الآن مثالا مع الأعداد الحقيقية. لنفترض أن البايتات المتغيرة سيكون لها قيمة
10، المكدس سيكون:

1. ||

2. |10|

3. |10|8|

4. |10|8|*|

5. |80|

6. ||

ستؤدي معالجة المكدس (الخطوة 5) إلى استرداد قيمة واحدة من المكدس (من اليمين في
الخطوة 4). هذه هي عملية الضرب وهذا يأخذ قيمتين من المكدس كمدخلات.
يتم وضع النتيجة مرة أخرى على المكدس (القيمة 80 في هذه الحالة). للضرب
الترتيب لا يهم، ولكن بالنسبة للعمليات الأخرى مثل الطرح والقسمة فهو مهم.
على العموم لديك الترتيب التالي:

ص = أ - ب --> ص = ناقص (أ، ب) --> CDEF:y=A,B,-

هذا ليس بديهيًا جدًا (على الأقل معظم الناس لا يعتقدون ذلك). بالنسبة للدالة f(A,B)
يمكنك عكس موضع "f"، لكنك لا تعكس ترتيب المتغيرات.

التحول من خلال رغبات إلى RPN


أولاً، احصل على صورة واضحة لما تريد القيام به. قم بتقسيم المشكلة إلى أجزاء أصغر
أجزاء حتى لا يمكن تقسيمها بعد الآن. ثم يكون تحويل ملفك أمرًا بسيطًا إلى حد ما
الأفكار في RPN.

لنفترض أن لديك عدة RRDs وترغب في إضافة بعض العدادات فيها. يمكن لهذه
على سبيل المثال، عدادات كل رابط WAN تراقبه.

عندك:

router1.rrd مع link1in link2in
router2.rrd مع link1in link2in
router3.rrd مع link1in link2in

لنفترض أنك ترغب في جمع كل هذه العدادات، باستثناء link2in الموجود بداخلها
router2.rd. عليك فعل:

(في هذا المثال، "router1.rrd:link1in" يعني رابط DS link1in داخل RRD router1.rrd)

router1.rd:link1in
router1.rd:link2in
router2.rd:link1in
router3.rd:link1in
router3.rd:link2in
-------------------- +
(نتيجة المبلغ)

كدالة رياضية، يمكن كتابة هذا:

"إضافة (router1.rrd:link1in، router1.rrd:link2in، router2.rrd:link1in، router3.rrd:link1in)
، router3.rrd:link2.in)"

باستخدام RRDtool وRPN، حدد المدخلات أولاً:

DEF:a=router1.rrd:link1in:AVERAGE
DEF:b=router1.rrd:link2in:AVERAGE
DEF:c=router2.rrd:link1in:AVERAGE
DEF:d=router3.rrd:link1in:AVERAGE
DEF:e=router3.rrd:link2in:AVERAGE

الآن، تصبح الدالة الرياضية: "add(a,b,c,d,e)"

في RPN، لا يوجد عامل يجمع أكثر من قيمتين، لذا يتعين عليك القيام بعدة قيم
الإضافات. يمكنك إضافة a وb، وإضافة c إلى النتيجة، وإضافة d إلى النتيجة وإضافة e إلى
نتيجة.

دفع a: مكدس يحتوي على قيمة a
ادفع b وأضف: b,+ المكدس يحتوي على نتيجة a+b
ادفع c وأضف: c,+ المكدس يحتوي على نتيجة a+b+c
ادفع d وأضف: d,+ المكدس يحتوي على نتيجة a+b+c+d
ادفع e وأضف: e,+ المكدس يحتوي على نتيجة a+b+c+d+e

ما تم حسابه هنا سيتم كتابته على النحو التالي:

( ( ( (أ+ب) + ج) + د) + ه) >

هذا في RPN: "CDEF:result=a,b,+,c,+,d,+,e,+"

وهذا صحيح ولكن يمكن توضيحه أكثر للبشر. لا يهم إذا قمت بإضافة أ
إلى b ثم أضف c إلى النتيجة أو أضف أولاً b إلى c ثم أضف a إلى النتيجة. هذا
يجعل من الممكن إعادة كتابة RPN إلى "CDEF:result=a,b,c,d,e,+,+,+,+" وهو
تم تقييمها بشكل مختلف:

دفع قيمة المتغير a على المكدس: أ
دفع قيمة المتغير b على المكدس: ab
دفع قيمة المتغير c على المكدس: abc
دفع قيمة المتغير d على المكدس: abcd
دفع قيمة المتغير e على المكدس: abcde
عامل الدفع + على المكدس: abcde +
ومعالجتها: abc P (حيث P == d+e)
عامل الدفع + على المكدس: abc P +
ومعالجتها: ab Q (حيث Q == c+P)
عامل الدفع + على المكدس: ab Q +
ومعالجتها: a R (حيث R == b+Q)
عامل الدفع + على المكدس: a R +
ومعالجتها: S (حيث S == a+R)

كما ترون تعبير RPN "a، b، c، d، e، +، +، +، +، +" سيتم تقييمه في
"((((d+e)+c)+b)+a)" ولها نفس نتيجة "a,b,+,c,+,d,+,e,+". هذا يسمي
قانون الجمع التبادلي، ولكن قد تنسى هذا على الفور، طالما أنك
تذكر ما يعنيه.

انظر الآن إلى التعبير الذي يحتوي على الضرب:

أولاً في الرياضيات العادية: "دع النتيجة = أ+ب*ج". في هذه الحالة لا يمكنك اختيار الطلب
بنفسك، عليك أن تبدأ بالضرب ثم تضيف إليه. يمكنك تغيير
موضع b وc، يجب ألا تغير موضع a وb.

عليك أن تأخذ ذلك في الاعتبار عند تحويل هذا التعبير إلى RPN. اقرأها
على النحو التالي: "أضف نتيجة b*c إلى a" وبعد ذلك يكون من السهل كتابة تعبير RPN:
"result=a,b,c,*,+" تعبير آخر من شأنه أن يعيد نفس الشيء: "result=b,c,*,a,+"

في الرياضيات العادية، قد تواجه شيئًا مثل "a*(b+c)" ويمكن أيضًا تحويله
في RPN. يخبرك القوسان فقط بإضافة b وc أولاً، ثم ضرب a في
نتيجة. مرة أخرى، أصبح من السهل الآن كتابتها بلغة RPN: "result=a,b,c,+,*". لاحظ أن هذا
يشبه إلى حد كبير أحد التعبيرات في الفقرة السابقة، فقط الضرب
والإضافة تغيرت الأماكن.

عندما تواجه مشكلات مع RPN أو عندما تشكو RRDtool، فهذا عادةً أمر جيد
لكتابة المكدس على قطعة من الورق ومعرفة ما سيحدث. اجعل الدليل جاهزًا
والتظاهر بأنه RRDtool. فقط قم بإجراء جميع العمليات الحسابية يدويًا لترى ما سيحدث، أنا متأكد
سيؤدي هذا إلى حل معظم المشكلات التي تواجهها، إن لم يكن كلها.

بعض تختص أرقام


غير معروف قيمنا
في بعض الأحيان، سيفشل جمع بياناتك. يمكن أن يكون هذا شائعًا جدًا، خاصة عندما
الاستعلام عن الروابط المشغولة. يمكن تكوين أداة RRDtool للسماح بواحد (أو حتى أكثر)
قيمة (قيم) غير معروفة وحساب التحديث المفقود. يمكنك، على سبيل المثال، الاستعلام عن الخاص بك
الجهاز كل دقيقة يؤدي هذا إلى إنشاء ما يسمى بـ PDP أو نقطة البيانات الأساسية في الدقيقة.
إذا قمت بتعريف RRD الخاص بك ليحتوي على RRA الذي يخزن قيم 5 دقائق، فستحتاج إلى خمسة منها
PDPs هذه لإنشاء CDP واحد (نقطة بيانات مجمعة). يمكن أن تصبح PDPs هذه غير معروفة في
حالتين:

1. التحديثات متباعدة جدًا. يتم ضبط هذا باستخدام إعداد "نبضات القلب".

2. تم ضبط التحديث على "غير معروف" عن قصد عن طريق عدم إدخال أي قيمة (باستخدام القالب
الخيار) أو باستخدام "U" كقيمة لإدراجها.

عند حساب CDP، تحدد آلية أخرى ما إذا كان CDP صالحًا أم لا. لو
هناك عدد كبير جدًا من عمليات PDP غير معروفة، كما أن CDP غير معروف أيضًا. يتم تحديد ذلك بواسطة
عامل xff. يرجى ملاحظة أن تحديثًا واحدًا غير معروف للعداد يمكن أن يؤدي إلى عمليتي PDP غير معروفتين! لو
أنت تسمح فقط بـ PDP واحد غير معروف لكل CDP، مما يجعل CDP غير معروف!

لنفترض أن العداد يزيد بمقدار واحد في الثانية وأنك تسترده كل دقيقة:

القيمة المضادة المعدل الناتج
10'000
10'060 1; (10'060-10'000)/60 == 1
10'120 1; (10'120-10'060)/60 == 1
غير معروف غير معروف؛ أنت لا تعرف القيمة الأخيرة
10'240 غير معروف؛ أنت لا تعرف القيمة السابقة
10'300 1; (10'300-10'240)/60 == 1

إذا تم حساب CDP من التحديثات الخمسة الأخيرة، فسوف تحصل على عمليتين PDP غير معروفتين
وثلاثة PDPs معروفة. إذا تم ضبط xff على 0.5 وهو بالمناسبة أمر شائع
العامل المستخدم، سيكون لـ CDP قيمة معروفة تبلغ 1. إذا تم ضبط xff على 0.2، إذن
سيكون CDP الناتج غير معروف.

يجب عليك تحديد القيم المناسبة لنبضات القلب وعدد PDPs لكل CDP وxff
عامل. كما ترون من النص السابق فإنهم يحددون سلوك RRA الخاص بك.

العمل مع غير معروف البيانات in من خلال قاعدة بيانات
كما قرأت في الفصل السابق، يمكن ضبط الإدخالات في RRA على المجهول
قيمة. إذا قمت بإجراء حسابات بهذا النوع من القيمة، فيجب أن تكون النتيجة غير معروفة أيضًا.
هذا يعني أن تعبيرًا مثل "result=a,b,+" سيكون غير معروف إذا كان a أو b كذلك
مجهول. سيكون من الخطأ تجاهل القيمة غير المعروفة وإرجاع قيمة
معلمة أخرى. من خلال القيام بذلك، ستفترض أن كلمة "غير معروف" تعني "صفر" وهذا ليس كذلك
صحيح.

كانت هناك حالة حيث كان شخص ما يجمع البيانات لأكثر من عام. قطعة جديدة من
تم تركيب المعدات، وتم إنشاء RRD جديد وتم تغيير البرامج النصية لإضافة ملف
عداد من قاعدة البيانات القديمة وعداد من قاعدة البيانات الجديدة. وكانت النتيجة
مخيب للآمال، يبدو أن جزءًا كبيرًا من الإحصائيات قد اختفى في ظروف غامضة ...
بالطبع لم يفعلوا ذلك، تمت إضافة قيم من قاعدة البيانات القديمة (القيم المعروفة) إلى القيم
من قاعدة البيانات الجديدة (قيم غير معروفة) وكانت النتيجة غير معروفة.

في هذه الحالة، من المعقول إلى حد ما استخدام CDEF الذي يحول البيانات غير المعروفة إلى صفر.
عدادات الجهاز لم تكن معروفة (بعد كل شيء، لم يتم تثبيته بعد!) لكنك تعلم
أن معدل البيانات عبر الجهاز يجب أن يكون صفرًا (لنفس السبب: لقد كان كذلك
غير مثبت).

هناك بعض الأمثلة أدناه التي تجعل هذا التغيير.

اللامحدودية
البيانات اللانهائية هي شكل آخر من أشكال الأرقام الخاصة. لا يمكن رسمها بيانيا لأنه بواسطة
التعريف أنك لن تصل أبدًا إلى القيمة اللانهائية. يمكنك التفكير بشكل إيجابي و
اللانهاية السالبة اعتمادًا على الموضع بالنسبة للصفر.

أداة RRDtool قادرة على تمثيل (-وليس- الرسوم البيانية!) اللانهاية من خلال التوقف عند تيارها
الحد الأقصى (لللانهاية الإيجابية) أو الحد الأدنى (لللانهاية السالبة) دون معرفة ذلك
ما في وسعنا).

يتم استخدام Infinity في RRDtool في الغالب لرسم منطقة دون معرفة عموديها
أبعاد. يمكنك التفكير في الأمر على أنه رسم منطقة بارتفاع وعرض لا نهائي
فقط الجزء الذي يظهر في الرسم البياني الحالي. ربما تكون هذه طريقة جيدة لذلك
اللانهاية التقريبية وهي بالتأكيد تسمح ببعض الحيل الرائعة. انظر أدناه للحصول على أمثلة.

العمل مع غير معروف البيانات و انفينتي
في بعض الأحيان قد ترغب في تجاهل البيانات غير المعروفة والتظاهر بأنها صفر (أو أي بيانات أخرى).
قيمة لهذه المسألة) وأحيانًا ترغب في التظاهر بأن البيانات المعروفة غير معروفة
(لتجاهل البيانات المعروفة بأنها خاطئة). هذا هو السبب وراء دعم CDEFs للبيانات غير المعروفة.
هناك أيضًا أمثلة متاحة تظهر بيانات غير معروفة باستخدام اللانهاية.

بعض أمثلة


على سبيل المثال: استخدام a مؤخرا خلق RRD
أنت تحتفظ بإحصائيات على جهاز التوجيه الخاص بك منذ أكثر من عام الآن. قمت مؤخرا بتثبيت
جهاز توجيه إضافي وترغب في إظهار الإنتاجية المدمجة لهذين الجهازين.

إذا قمت فقط بإضافة العدادات من router.rrd وrouter2.rrd، فستضيف البيانات المعروفة
(من router.rrd) إلى بيانات غير معروفة (من router2.rrd) للجزء الأكبر من إحصائياتك.
يمكنك حل هذا بعدة طرق:

· أثناء إنشاء قاعدة البيانات الجديدة، املأها بالأصفار من البداية إلى الآن. لديك
لجعل قاعدة البيانات تبدأ عند أو قبل آخر مرة في قاعدة البيانات الأخرى.

· بدلاً من ذلك، يمكنك استخدام CDEF وتعديل البيانات غير المعروفة إلى الصفر.

كلا الطريقتين لها إيجابيات وسلبيات. الطريقة الأولى مزعجة وإذا أردت ذلك
افعل ذلك عليك أن تكتشف ذلك بنفسك. ليس من الممكن إنشاء قاعدة بيانات مليئة
أما بالنسبة للأصفار، فيجب عليك إدخالها يدويًا. تم شرح تنفيذ الطريقة الثانية
التالى:

ما نريده هو: "إذا كانت القيمة غير معروفة، نستبدلها بصفر". يمكن كتابة هذا في
رمز زائف على النحو التالي: إذا (القيمة غير معروفة) ثم (صفر) آخر (القيمة). عند قراءة rrdgraph
دليل لاحظت وظيفة "الأمم المتحدة" التي ترجع صفر أو واحد. لاحظت أيضًا "IF"
الدالة التي تأخذ صفر أو واحد كمدخل.

انظر أولاً إلى وظيفة "IF". يأخذ ثلاث قيم من المكدس، القيمة الأولى هي
نقطة القرار، يتم إرجاع القيمة الثانية إلى المكدس إذا كان التقييم "صحيحًا"
وإذا لم يكن الأمر كذلك، فسيتم إرجاع القيمة الثالثة إلى المكدس. نريد أن تقرر وظيفة "الأمم المتحدة".
ماذا يحدث لذلك نقوم بدمج هاتين الوظيفتين في CDEF واحد.

لنكتب المسارين المحتملين للدالة "IF":

إذا كان صحيحا العودة أ
إذا كانت العودة كاذبة ب

في RPN: "result=x,a,b,IF" حيث تكون "x" إما صحيحة أو خاطئة.

الآن يتعين علينا ملء "x"، ويجب أن يكون هذا هو الجزء "(القيمة غير معروفة)" وهذا موجود
RPN: "النتيجة = القيمة، الأمم المتحدة"

نقوم الآن بدمجها: "result=value,UN,a,b,IF" وعندما نملأ الأشياء المناسبة
بالنسبة لـ "a" و"b" انتهينا:

"CDEF:result=value,UN,0,value,IF"

قد ترغب في قراءة دليل RPN الخاص بـ Steve Rader إذا كنت تواجه صعوبات في الطريقة التي أتبعها
وأوضح هذا المثال الأخير.

إذا كنت تريد التحقق من تعبير RPN هذا، فما عليك سوى محاكاة سلوك أداة RRDtool:

بالنسبة لأي قيمة معروفة، يتم تقييم التعبير كما يلي:
CDEF:result=value,UN,0,value,IF (value,UN) غير صحيحة لذا تصبح 0
CDEF:result=0,0,value,IF ستُرجع "IF" القيمة الثالثة
CDEF:result=value يتم إرجاع القيمة المعروفة

بالنسبة للقيمة غير المعروفة يحدث هذا:
CDEF:result=value,UN,0,value,IF (value,UN) صحيحة بحيث تصبح 1
CDEF:result=1,0,value,IF يرى "IF" 1 ويعيد القيمة الثانية
CDEF:result=0 تم إرجاع الصفر

بالطبع، إذا كنت ترغب في رؤية قيمة أخرى بدلاً من الصفر، فيمكنك استخدام تلك القيمة الأخرى
.

في النهاية، عندما تتم إزالة كافة البيانات غير المعروفة من RRD، قد ترغب في إزالة هذا
القاعدة بحيث يتم عرض البيانات غير المعروفة بشكل صحيح.

على سبيل المثال: أفضل معالجة of غير معروف البيانات، by استخدام الوقت
المثال أعلاه له عيب واحد. إذا قمت بتسجيل بيانات غير معروفة في قاعدة البيانات الخاصة بك بعد ذلك
عند تثبيت معداتك الجديدة، سيتم ترجمتها أيضًا إلى صفر، وبالتالي أنت
لن أرى أن هناك مشكلة. هذا ليس جيدًا وما تريد فعله حقًا هو:

· إذا كانت هناك بيانات غير معروفة، فانظر إلى وقت أخذ هذه العينة.

· إذا كانت القيمة المجهولة قبل الوقت xxx، فاجعلها صفراً.

· إذا كان بعد الوقت xxx، اتركه كبيانات غير معروفة.

وهذا أمر ممكن التنفيذ: يمكنك مقارنة الوقت الذي تم فيه أخذ العينة ببعض الوقت المعروف.
على افتراض أنك بدأت في مراقبة جهازك يوم الجمعة 17 سبتمبر 1999، الساعة 00:35:57 بتوقيت وسط أوروبا
التوقيت الصيفي. ترجمة هذه المرة بالثواني منذ 1970/01/01 وتصبح 937'521'357. اذا أنت
قم بمعالجة القيم غير المعروفة التي تم استلامها بعد هذا الوقت، فأنت تريد تركها مجهولة
وإذا تم "استلامها" قبل هذا الوقت، فأنت تريد ترجمتها إلى صفر (وبالتالي أنت
يمكن تجاهلها بشكل فعال أثناء إضافتها إلى عدادات أجهزة التوجيه الأخرى).

يمكن ترجمة الجمعة 17 سبتمبر 1999، الساعة 00:35:57 MET DST إلى 937'521'357 عن طريق،
على سبيل المثال، باستخدام تاريخ جنو:

التاريخ -د "19990917 00:35:57" +%s

يمكنك أيضًا تفريغ قاعدة البيانات ومعرفة أين تبدأ معرفة البيانات. هناك
عدة طرق أخرى للقيام بذلك، ما عليك سوى اختيار واحدة.

الآن علينا أن نخلق السحر الذي يسمح لنا بمعالجة القيم غير المعروفة بشكل مختلف
اعتمادا على الوقت الذي تم فيه أخذ العينة. هذه عملية من ثلاث خطوات:

1. إذا كان الطابع الزمني للقيمة بعد 937'521'357، فاتركها كما هي.

2. إذا كانت القيمة قيمة معروفة، فاتركها كما هي.

3. قم بتغيير القيمة غير المعروفة إلى صفر.

لننظر إلى الجزء الأول:

إذا (صحيح) قم بإرجاع القيمة الأصلية

نعيد كتابة هذا:

إذا (صحيح) يعود "أ"
إذا (خطأ) أرجع "ب"

نحن بحاجة لحساب صحيح أو خطأ من الخطوة 1. هناك وظيفة متاحة ترجع
الطابع الزمني للعينة الحالية. يطلق عليه، كم هو مدهش، "الوقت". هذا الوقت
لا بد من مقارنتها بعدد ثابت، ونحن بحاجة إلى "GT". إخراج "GT" صحيح أو خطأ
وهذا مدخل جيد لـ "IF". نريد "إذا (الوقت> 937521357) ثم (إرجاع أ) آخر
(العودة ب)".

لقد سبق أن تم وصف هذه العملية بدقة في الفصل السابق، لذا فلنقم بذلك سريعًا:

إذا (x) ثم آخر ب
حيث يمثل x "الوقت> 937521357"
حيث تمثل القيمة الأصلية
حيث يمثل b نتيجة المثال السابق

الوقت>937521357 --> الوقت،937521357،GT

إذا (x) ثم آخر ب --> x,a,b,IF
استبدل x --> TIME,937521357,GT,a,b,IF
استبدل a --> TIME,937521357,GT,value,b,IF
البديل ب --> TIME,937521357,GT,value,value,UN,0,value,IF,IF

انتهى بنا الأمر إلى: "CDEF:result=TIME,937521357,GT,value,value,UN,0,value,IF,IF"

يبدو هذا معقدًا للغاية، ولكن كما ترون، لم يكن من الصعب جدًا التوصل إليه.

على سبيل المثال: التظاهر غريب البيانات ليس هناك
لنفترض أن لديك مشكلة تظهر على شكل ارتفاعات كبيرة في الرسم البياني الخاص بك. أنت تعرف هذا
يحدث ولماذا، لذلك عليك أن تقرر إيجاد حل لهذه المشكلة. ربما كنت تستخدم الخاص بك
الشبكة لإجراء نسخة احتياطية في الليل، وبذلك تحصل على ما يقرب من 10 ميجابايت/ثانية بينما تحصل بقية
نشاط شبكتك لا ينتج أرقامًا أعلى من 100 كيلو بايت/ثانية.

قد تختلف الرسوم بناءً على سرعة الشحن المتوفرة:

1. إذا تجاوز الرقم 100 كيلو بايت/ثانية فهذا خطأ وتريد إخفاءه بتغييره
إلى مجهول.

2. لا تريد أن يظهر الرسم البياني أكثر من 100 كيلو بايت/ثانية.

الكود الزائف: إذا (الرقم > 100) ثم رقم آخر غير معروف أو الكود الزائف: إذا (الرقم > 100)
ثم 100 رقم آخر.

يمكن أيضًا حل "المشكلة" الثانية باستخدام الخيار الصارم للرسم البياني RRDtool،
ولكن هذا ليس له نفس النتيجة. في هذا المثال، يمكنك أن تنتهي برسم بياني
يقوم بالتحجيم التلقائي. وأيضًا، إذا استخدمت الأرقام لعرض الحد الأقصى، فسيتم ضبطها عليه
100 كيلو بايت / ثانية.

نستخدم "IF" و"GT" مرة أخرى. "إذا (x) ثم (y) آخر (z)" يتم كتابته كـ
"CDEF:result=x,y,z,IF"; الآن املأ x و y و z. بالنسبة لـ x، تقوم بملء "رقم أكبر من
100kb/s" تصبح "number,100000,GT" (الكيلو هو 1'000 وb/s هو ما نقيسه!).
الجزء هو "رقم" في كلتا الحالتين والجزء "y" هو إما "UNKN" للمجهول أو "100000"
ل 100 كيلو بايت / ثانية.

التعبيران CDEF سيكونان:

CDEF:result=number,100000,GT,UNKN,number,IF
CDEF:النتيجة=رقم،100000،GT،100000،رقم،IF

على سبيل المثال: عامل on a معين الوقت امتداد
إذا كنت تريد رسمًا بيانيًا يمتد لبضعة أسابيع، ولكنك تريد فقط رؤية بعض بيانات أجهزة التوجيه
لمدة أسبوع واحد، تحتاج إلى "إخفاء" بقية الإطار الزمني. لا تسألني متى سيحدث هذا
تكون مفيدة، انها هنا فقط على سبيل المثال :)

نحتاج إلى مقارنة الطابع الزمني بتاريخ البدء وتاريخ الانتهاء. المقارنة ليست كذلك
صعب:

الوقت، بداية، GE
الوقت، نهاية الوقت، جنيه

هذين الجزأين من CDEF ينتجان إما 0 للخطأ أو 1 للصواب. يمكننا الآن التحقق مما إذا كان
كلاهما 0 (أو 1) باستخدام بعض عبارات IF، لكن كما أشار واتارو ساتوه، يمكننا
استخدم الدالتين "*" أو "+" كدالتين منطقيتين ومنطقيتين OR.

بالنسبة إلى "*"، ستكون النتيجة صفرًا (خطأ) إذا كان أحد العاملين يساوي صفرًا. ل
"+"، ستكون النتيجة خطأ (0) فقط عند إضافة عاملين خطأ (0).
تحذير: *أي* رقم لا يساوي 0 سيتم اعتباره "صحيحًا". وهذا يعني أنه ل
على سبيل المثال، "-1,1,+" (والتي يجب أن تكون "صحيحة أو صحيحة") ستصبح FALSE ... وبعبارة أخرى،
استخدم "+" فقط إذا كنت متأكدًا من أن لديك أرقامًا موجبة (أو صفرًا) فقط.

لنقم بتجميع CDEF الكامل:

DEF:ds0=router1.rrd:المتوسط
CDEF:ds0modified=TIME،begintime،GT،TIME،endtime،LE،*،ds0،UNKN،IF

سيعيد هذا قيمة ds0 إذا كانت كلتا المقارنتين صحيحتين. يمكنك أيضا أن تفعل ذلك
على العكس من ذلك:

DEF:ds0=router1.rrd:المتوسط
CDEF:ds0modified=TIME,begintime,LT,TIME,endtime,GT,+,UNKN,ds0,IF

سيؤدي هذا إلى إرجاع غير معروف إذا كانت أي من المقارنة صحيحة.

على سبيل المثال: أنت مشتبه فيه إلى لديك مشاكل و تريد إلى انظر تعريف غير معروف البيانات.
لنفترض أنك قمت بإضافة عدد المستخدمين النشطين على عدة خوادم طرفية. إذا كان واحد منهم
لا يعطي إجابة (أو إجابة غير صحيحة) تحصل على "NaN" في قاعدة البيانات ("ليست a
Number") ويتم تقييم NaN على أنه غير معروف.

في هذه الحالة، تود أن يتم تنبيهك إليه ويكون مجموع القيم المتبقية هو
لا قيمة لك.

سيكون شيئًا مثل:

DEF:users1=location1.rrd:onlineTS1:LAST
DEF:users2=location1.rrd:onlineTS2:LAST
DEF:users3=location2.rrd:onlineTS1:LAST
DEF:users4=location2.rrd:onlineTS2:LAST
CDEF: allusers=users1,users2,users3,users4,+,+,+

إذا قمت الآن برسم كافة المستخدمين، فستظهر البيانات غير المعروفة في أحد المستخدمين1..المستخدمين4 كفجوة في
الرسم البياني الخاص بك. تريد تعديل هذا لإظهار خط أحمر ساطع، وليس فجوة.

حدد CDEF إضافيًا غير معروف إذا كان كل شيء على ما يرام ويكون لانهائيًا إذا كان هناك مجهول
القيمة:

CDEF:wrongdata=allusers,UN,INF,UNKN,IF

سيتم تقييم "allusers,UN" إما بصواب أو خطأ، وهو الجزء (x) من "IF"
الوظيفة وتتحقق مما إذا كان جميع المستخدمين غير معروفين. تم ضبط الجزء (y) من الدالة "IF".
إلى "INF" (وهو ما يعني اللانهاية) ويقوم الجزء (z) من الدالة بإرجاع "UNKN".

المنطق هو: إذا (جميع المستخدمين == غير معروفين) قم بإرجاع INF وإلا قم بإرجاع UNKN.

يمكنك الآن استخدام AREA لعرض هذه "البيانات الخاطئة" باللون الأحمر الفاتح. إذا كان غير معروف (لأن
جميع المستخدمين معروفون) فلن تظهر المنطقة الحمراء. إذا كانت القيمة هي INF (لأن allusers
غير معروف) فسيتم ملء المنطقة الحمراء على الرسم البياني في ذلك الوقت المحدد.

المنطقة: allusers#0000FF: عدد المستخدمين المدمجين
المنطقة:بيانات خاطئة#FF0000:بيانات غير معروفة

نفسه مثال مفيد مع مرصوصة بيانات:
إذا كنت تستخدم المكدس في المثال السابق (كما سأفعل)، فإنك لا تضيف القيم.
لذلك، لا توجد علاقة بين القيم الأربع ولن تحصل على واحدة
قيمة للاختبار. لنفترض أن المستخدمين 3 سيكونون غير معروفين في وقت ما: تم رسم المستخدمين 1،
يتم تكديس المستخدمين 2 فوق المستخدمين 1، ويكون المستخدمون 3 غير معروفين وبالتالي لا يحدث شيء،
تم تكديس users4 فوق users2. أضف ملفات CDEF الإضافية على أي حال واستخدمها للتراكب
الرسم البياني "العادي":

DEF:users1=location1.rrd:onlineTS1:LAST
DEF:users2=location1.rrd:onlineTS2:LAST
DEF:users3=location2.rrd:onlineTS1:LAST
DEF:users4=location2.rrd:onlineTS2:LAST
CDEF: allusers=users1,users2,users3,users4,+,+,+
CDEF:wrongdata=allusers,UN,INF,UNKN,IF
المنطقة:المستخدمون1#0000FF:المستخدمون في ts1
المكدس:users2#00FF00:المستخدمون في ts2
المكدس:users3#00FFFF:المستخدمون في ts3
المكدس:users4#FFFF00:المستخدمون في ts4
المنطقة:بيانات خاطئة#FF0000:بيانات غير معروفة

إذا كانت هناك بيانات غير معروفة في أحد users1..users4، فسيتم رسم منطقة "البيانات الخاطئة" و
لأنه يبدأ من المحور السيني وله ارتفاع لا نهائي، فإنه سيحل محل الملف بشكل فعال
أجزاء مكدسة.

يمكنك دمج سطري CDEF في سطر واحد (نحن لا نستخدم "allusers") إذا أردت. لكن
هناك أسباب وجيهة لكتابة اثنين من CDEFS:

· أنه يحسن إمكانية قراءة البرنامج النصي.

· يمكن استخدامه داخل GPRINT لعرض العدد الإجمالي للمستخدمين.

إذا اخترت الجمع بينهما، فيمكنك استبدال "Allusers" في CDEF الثاني بـ
الجزء الذي بعد علامة المساواة من السطر الأول:

CDEF:بيانات خاطئة=users1,users2,users3,users4,+,+,+,UN,INF,UNKN,IF

إذا قمت بذلك، فلن تتمكن من استخدام GPRINTs التالية:

تعليق:"إجمالي عدد المستخدمين الذين تمت مشاهدتهم"
GPRINT:جميع المستخدمين:MAX:"الحد الأقصى: %6.0lf"
GPRINT:جميع المستخدمين:MIN:"الحد الأدنى: %6.0lf"
GPRINT:جميع المستخدمين:AVERAGE:"المتوسط: %6.0lf"
GPRINT:جميع المستخدمين:الأخير:"الحالي: %6.0lf\n"

أمثلة تبدأ من ال RRD رسم بياني كتيب صفحة


درجة درجة مئوية مقابل درجة فهرنهايت
لتحويل الدرجة المئوية إلى فهرنهايت استخدم الصيغة F=9/5*C+32

rrdtool graph demo.png --title="الرسم البياني التجريبي" \
DEF:cel=demo.rrd:exhaust:AVERAGE \
CDEF:البعيد=9,5,/,cel,*,32,+ \
LINE2:cel#00a000:"درجة مئوية" \
LINE2:far#ff0000:"د. فهرنهايت\c"

يحصل هذا المثال على DS المسمى "exhaust" من قاعدة البيانات "demo.rrd" ويضع القيم فيه
المتغير "سيل". يتم تقييم CDEF المستخدم على النحو التالي:

CDEF:البعيد=9,5,/,cel,*,32,+
1. اضغط 9، اضغط 5
2. دفع وظيفة "التقسيم" ومعالجتها
المكدس يحتوي الآن على 9/5
3. دفع المتغير "cel"
4. دفع وظيفة "الضرب" ومعالجتها
تحتوي المكدس الآن على 9/5*cel
5. ادفع 32
6. دفع وظيفة "زائد" ومعالجتها
المكدس يحتوي الآن على درجة الحرارة بالفهرنهايت

متغير غير معروف إلى صفر
rrdtool graph demo.png --title="الرسم البياني التجريبي" \
DEF:idat1=interface1.rrd:ds0:AVERAGE \
DEF:idat2=interface2.rrd:ds0:AVERAGE \
DEF:odat1=interface1.rrd:ds1:AVERAGE \
DEF:odat2=interface2.rrd:ds1:AVERAGE \
CDEF:agginput=idat1,UN,0,idat1,IF,idat2,UN,0,idat2,IF,+,8,* \
CDEF:aggoutput=odat1,UN,0,odat1,IF,odat2,UN,0,odat2,IF,+,8,* \
المنطقة: agginput#00cc00:إجمالي الإدخال \
LINE1:aggoutput#0000FF:إجمالي الإخراج

تم بناء هذين CDEFs من عدة وظائف. يساعد على تقسيمها عند عرض ما
إنهم يفعلون. بدءًا من CDEF الأول سنحصل على:

idat1، الأمم المتحدة -> أ
0 --> ب
idat1 --> ج
إذا (أ) ثم (ب) وإلا (ج)

وبالتالي تكون النتيجة "0" إذا كان صحيحًا أن "idat1" يساوي "UN". إذا لم يكن كذلك، الأصلي
يتم وضع قيمة "idat1" مرة أخرى على المكدس. دعنا نسمي هذه الإجابة "د". هذه العملية
تكرار العناصر الخمسة التالية في المكدس، ويتم نفس الشيء وسيعود بالإجابة
"ح". وبالتالي فإن المكدس الناتج هو "d,h". لقد تم تبسيط التعبير إلى
"d,h,+,8,*" وسيكون من السهل الآن رؤية أننا نضيف "d" و"h" ونضرب
النتيجة بثمانية.

والنتيجة النهائية هي أننا أضفنا "idat1" و"idat2" وفي هذه العملية قمنا بذلك بشكل فعال
تجاهل القيم غير المعروفة. يتم ضرب النتيجة بثمانية، ومن المرجح أن يتم تحويل البايت/الثانية
إلى بت / ثانية.

اللامحدودية عرض
rrdtool graph example.png --title="INF التجريبي" \
DEF:val1=some.rrd:ds0:AVERAGE \
DEF:val2=some.rrd:ds1:AVERAGE \
DEF:val3=some.rrd:ds2:AVERAGE \
DEF:val4=other.rrd:ds0:AVERAGE \
CDEF:الخلفية=val4,POP,TIME,7200,%,3600,LE,INF,UNKN,IF \
CDEF:wipeout=val1,val2,val3,val4,+,+,+,UN,INF,UNKN,IF \
المنطقة: الخلفية #F0F0F0 \
المنطقة:val1#0000FF:Value1 \
المكدس:val2#00C000:Value2 \
المكدس:val3#FFFF00:Value3 \
المكدس:val4#FFC000:Value4 \
المنطقة:whipeout#FF0000:غير معروف

يوضح هذا العرض التوضيحي طريقتين لاستخدام اللانهاية. من الصعب بعض الشيء رؤية ما يحدث فيه
"الخلفية" CDEF.

"val4، POP، TIME، 7200،٪، 3600، LE، INF، UNKN، IF"

يأخذ RPN قيمة "val4" كمدخل ثم يقوم بإزالتها على الفور من المكدس
باستخدام "POP". المكدس فارغ الآن ولكن كأثر جانبي نعرف الآن الوقت الذي حدث فيه ذلك
تم أخذ العينة. يتم وضع هذه المرة على المكدس بواسطة وظيفة "TIME".

"TIME,7200,%" يأخذ مقياس الوقت و7'200 (أي ساعتين). النتيجة
ستكون القيمة الموجودة على المكدس رقمًا في النطاق من 0 إلى 7199.

بالنسبة للأشخاص الذين لا يعرفون وظيفة modulo: فهي الباقي بعد عدد صحيح
قسم. إذا قسمت 16 على 3، فسيكون الجواب 5 والباقي سيكون 1.
"16,3،%" ترجع 1.

لدينا نتيجة "TIME,7200,%" على المكدس، فلنسميها "a". بداية RPN
أصبح "a,3600,LE" وهذا يتحقق مما إذا كان "a" أقل أو يساوي "3600". هذا صحيح
نصف الوقت. يتعين علينا الآن معالجة بقية RPN وهذا أمر بسيط فقط
الدالة "IF" التي تُرجع إما "INF" أو "UNKN" حسب الوقت. يتم إرجاع هذا
إلى "الخلفية" المتغيرة.

تمت مناقشة CDEF الثاني مسبقًا في هذه الوثيقة، لذا لن نفعل ذلك هنا.

الآن يمكنك رسم طبقات مختلفة. ابدأ بالخلفية غير المعروفة
(لا شيء يمكن رؤيته) أو لا نهائي (يتم ملء الجزء الإيجابي بالكامل من الرسم البياني).

بعد ذلك، تقوم برسم البيانات أعلى هذه الخلفية، وسوف تتراكب مع الخلفية. يفترض
أحد val1..val4 سيكون غير معروف، وفي هذه الحالة سينتهي بك الأمر بثلاثة أشرطة فقط مكدسة
على رأس كل منهما الآخر. لا تريد رؤية هذا لأن البيانات تكون صالحة فقط عند الكل
أربعة متغيرات صالحة. هذا هو سبب استخدامك لـ CDEF الثاني، فهو سيقوم بتراكب البيانات
مع منطقة بحيث لا يمكن رؤية البيانات بعد الآن.

إذا كان من الممكن أن تحتوي بياناتك أيضًا على قيم سلبية، فستحتاج أيضًا إلى الكتابة فوق النصف الآخر منها
الرسم البياني الخاص بك. يمكن القيام بذلك بطريقة بسيطة نسبيًا: ما تحتاجه هو "المسح"
المتغير ووضع إشارة سالبة قبله: "CDEF:wipeout2=wipeout,-1,*"

تصفية البيانات
يمكنك القيام ببعض تصفية البيانات المعقدة:

مرشح متوسط: مرشحات ضوضاء النار

DEF:var=database.rrd:traffic:AVERAGE
CDEF:prev1=PREV(var)
CDEF:prev2=PREV(prev1)
CDEF: الوسيط = فار، prev1، prev2,3،XNUMX، SORT، POP، EXC، POP
LINE3:median#000077:تمت تصفيته
LINE1:prev2#007700:'بيانات أولية'

مشتق:

DEF:var=database.rrd:traffic:AVERAGE
CDEF:prev1=PREV(var)
CDEF:time=var,POP,TIME
CDEF:الوقت السابق=PREV(الوقت)
CDEF:مشتق=var,prev1,-,time,prevtime,-,/
LINE3:مشتق#000077:مشتق
LINE1:var#007700:'بيانات أولية'

خارج of الأفكار For الآن


تم إنشاء هذا المستند بناءً على الأسئلة التي طرحتها أنا أو أشخاص آخرون على الموقع
القائمة البريدية لـ RRDtool واسمحوا لي أن أعرف إذا وجدت أخطاء فيه أو إذا كان لديك مشكلة
فهم ذلك. إذا كنت تعتقد أنه يجب أن تكون هناك إضافة، راسلني عبر البريد الإلكتروني:
<[البريد الإلكتروني محمي]>

تذكر: لا ردود الفعل يساوي لا التغييرات!

استخدم cdeftutorial عبر الإنترنت باستخدام خدمات onworks.net


خوادم ومحطات عمل مجانية

قم بتنزيل تطبيقات Windows و Linux

أوامر لينكس

Ad