يؤدي ضبط متغير البيئة TZ إلى توفير آلاف مكالمات النظام (2017)

TL ؛ الدكتور

تشرح مشاركة المدونة هذه كيف يمكن أن يؤدي تعيين متغير بيئة إلى توفير الآلاف (أو في بعض الحالات عشرات الآلاف) من مكالمات النظام غير الضرورية التي يمكن إنشاؤها بواسطة glibc في فترات زمنية قصيرة.

تم اختبار ذلك على Ubuntu Precise (12.04) و Ubuntu Xenial (16.04). ربما ينطبق هذا أيضًا على إصدارات أخرى من Linux. من السهل جدًا اختبار ما إذا كان هذا ينطبق عليك وتصحيحه ، إذا كان الأمر كذلك. استمر في القراءة لمزيد من التفاصيل! ملخص سريع

لتجنب استدعاءات النظام الإضافية على عمليات الخادم حيث لن تقوم بتحديث المنطقة الزمنية (أو يمكنك إعادة تشغيل العمليات عندما تفعل ذلك) ، ما عليك سوى تعيين متغير بيئة TZ على {/ etc / localtime (أو ملف منطقة زمنية أخرى من اختيارك ) لعملية. سيؤدي هذا إلى منع glibc من إجراء مكالمات إضافية (وغير ضرورية) للنظام.

لفهم سبب وكيفية اختبار ما إذا كانت عملياتك مفيدة ، تابع القراءة! المشكلة

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

كان الهدف من طريقة استدعاء نظام vDSO هو إنشاء طريقة لبعض مكالمات النظام المستخدمة بشكل متكرر (مثل gettimeofday ، والوقت ، و clock_gettime ، وما إلى ذلك) لتجنب الاضطرار إلى إدخال kernel والتسبب في تبديل السياق من المستخدم إلى kernel أرض. نتيجة هذه الطريقة هي أن بعض استدعاءات النظام ، مثل تلك المذكورة ، يمكن استخدامها بواسطة البرامج بتكلفة أقل بكثير.

ماذا لو اتصلت بإحدى مكالمات vDSO السريعة هذه (مثل الوقت) ، قمت أيضًا بالاتصال بمكالمة نظام عادية مثل ، على سبيل المثال ، stat ، والتي لا تمر عبر vDSO؟

إذا قمت بذلك ، فستتراجع بشكل أساسي عن بعض تحسين الأداء الذي كان من المفترض أن تكتسبه من تحسين vDSO في المقام الأول ؛ كثيرًا ما تجري مكالمة نظام بطيئة.

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

غالبًا ما يتم استخدام استدعاء نظام vDSO للوقت ووظيفة التوقيت المحلي glibc معًا في التطبيقات ، إما مباشرة بواسطة المبرمج أو على مستوى أقل دون علم المبرمج لتنسيق التواريخ والأوقات لكل شيء ، من رسائل السجل إلى استعلامات SQL . . يشيع استخدام هذا الزوج في Ruby on Rails.

اتضح أن وظيفة التوقيت المحلي glibc ستتحقق مما إذا تم تعيين متغير البيئة TZ. إذا لم يتم تعيينها (لم يتم تعيينها (جهازي Ubuntus اللذان اختبرتهما لم يتم ضبطهما) ، فسيستخدم glibc stat استدعاء النظام كلما تم استدعاء التوقيت المحلي .

بمعنى آخر: يدعم نظامك استدعاء نظام الوقت من خلال Linux kernel vDSO لتجنب تكلفة التبديل إلى kernel. ولكن بمجرد أن يستدعي برنامجك الوقت ، فإنه يتصل بالتوقيت المحلي مباشرة بعد ذلك ، والذي لا يزال يستدعي مكالمة نظام. لذلك قمت بإلغاء مكالمة النظام مع vDSO ، ولكنك استبدلتها بآخر.

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

عينة...

يؤدي ضبط متغير البيئة TZ إلى توفير آلاف مكالمات النظام (2017)
TL ؛ الدكتور

تشرح مشاركة المدونة هذه كيف يمكن أن يؤدي تعيين متغير بيئة إلى توفير الآلاف (أو في بعض الحالات عشرات الآلاف) من مكالمات النظام غير الضرورية التي يمكن إنشاؤها بواسطة glibc في فترات زمنية قصيرة.

تم اختبار ذلك على Ubuntu Precise (12.04) و Ubuntu Xenial (16.04). ربما ينطبق هذا أيضًا على إصدارات أخرى من Linux. من السهل جدًا اختبار ما إذا كان هذا ينطبق عليك وتصحيحه ، إذا كان الأمر كذلك. استمر في القراءة لمزيد من التفاصيل! ملخص سريع

لتجنب استدعاءات النظام الإضافية على عمليات الخادم حيث لن تقوم بتحديث المنطقة الزمنية (أو يمكنك إعادة تشغيل العمليات عندما تفعل ذلك) ، ما عليك سوى تعيين متغير بيئة TZ على {/ etc / localtime (أو ملف منطقة زمنية أخرى من اختيارك ) لعملية. سيؤدي هذا إلى منع glibc من إجراء مكالمات إضافية (وغير ضرورية) للنظام.

لفهم سبب وكيفية اختبار ما إذا كانت عملياتك مفيدة ، تابع القراءة! المشكلة

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

كان الهدف من طريقة استدعاء نظام vDSO هو إنشاء طريقة لبعض مكالمات النظام المستخدمة بشكل متكرر (مثل gettimeofday ، والوقت ، و clock_gettime ، وما إلى ذلك) لتجنب الاضطرار إلى إدخال kernel والتسبب في تبديل السياق من المستخدم إلى kernel أرض. نتيجة هذه الطريقة هي أن بعض استدعاءات النظام ، مثل تلك المذكورة ، يمكن استخدامها بواسطة البرامج بتكلفة أقل بكثير.

ماذا لو اتصلت بإحدى مكالمات vDSO السريعة هذه (مثل الوقت) ، قمت أيضًا بالاتصال بمكالمة نظام عادية مثل ، على سبيل المثال ، stat ، والتي لا تمر عبر vDSO؟

إذا قمت بذلك ، فستتراجع بشكل أساسي عن بعض تحسين الأداء الذي كان من المفترض أن تكتسبه من تحسين vDSO في المقام الأول ؛ كثيرًا ما تجري مكالمة نظام بطيئة.

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

غالبًا ما يتم استخدام استدعاء نظام vDSO للوقت ووظيفة التوقيت المحلي glibc معًا في التطبيقات ، إما مباشرة بواسطة المبرمج أو على مستوى أقل دون علم المبرمج لتنسيق التواريخ والأوقات لكل شيء ، من رسائل السجل إلى استعلامات SQL . . يشيع استخدام هذا الزوج في Ruby on Rails.

اتضح أن وظيفة التوقيت المحلي glibc ستتحقق مما إذا تم تعيين متغير البيئة TZ. إذا لم يتم تعيينها (لم يتم تعيينها (جهازي Ubuntus اللذان اختبرتهما لم يتم ضبطهما) ، فسيستخدم glibc stat استدعاء النظام كلما تم استدعاء التوقيت المحلي .

بمعنى آخر: يدعم نظامك استدعاء نظام الوقت من خلال Linux kernel vDSO لتجنب تكلفة التبديل إلى kernel. ولكن بمجرد أن يستدعي برنامجك الوقت ، فإنه يتصل بالتوقيت المحلي مباشرة بعد ذلك ، والذي لا يزال يستدعي مكالمة نظام. لذلك قمت بإلغاء مكالمة النظام مع vDSO ، ولكنك استبدلتها بآخر.

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

عينة...

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow