إستخدام open_file_cache في NGINX لتقليل إستهلاك IO وزيادة السرعة

في لينكس تستخدم الذاكرة المؤقتة RAM ليس فقط لمعالجة المهام الحالية بل هناك ايضاً Cache يقوم بتخزين المعلومات من الهارديسك, وذلك لسرعة الرجوع لها أو إعادة طلبها. هذا الشيء الهدف منه تقليل الضغط على الهارديسك والحفاظ قدر الامكان على معدل IO صغير, كون الهارديسك ابطئ بكثير من الرام في القراءة والكتابة وتتم العملية هذه بشكل تلقائي تديرها الكرنل الخاصة بالنظام, ولهذا السبب ايضاً دائماً عند استخدام الامر free -m نجد ان الرام المستهلك تقريباً 95% وفعلياً هو ليس كذالك. لكن ما دخل هذا بخاصية open_file_cache في NGINX.

إنجنكس يوفر خاصية بنفس الفكرة وهي open_file_cache حيث يتم تخزين الملفات التي تطلب كثيراً (في الحقيقة هذا يعتمد على الاعدادات) في الرام وعند طلبها يتم تسليمها للعميل (مثلاً المتصفح) بوقت اسرع وايضاً بإستهلاك موارد سيرفر أقل. تخيل لديك 2000 طلب/ث على ملف image.png (اوك هنا فعلياً دور الرام والسستم راح يشتغل تلقائياً) لكن مع الخاصية هذه انا استطيع التحكم بها بسهولة وحسب الرغبة مع تحديد صيغ الملفات التي يتم تخزينها في الرام.

متطلبات

  • وجود NGINX بالسيرفر يعمل كـ web server وليس proxy server (في الحقيقة ممكن تفعيلها ان كان انجنكس يعمل proxy على نفس سيرفر الويب او سيرفر اخر الامر فقط يتطلب المزيد من الاعدادات تختلف حسب الحالة).
  • السماح بفتح ملفات لا تقل عن 20 الف (شيك عبر ulimit وارفعها ان كانت قليلة لليوزر الذي يشغل NGINX).
  • وجود رام متاح يكفي (شيك عبر free -m ونقص من الاستهلاك كلً من cache, buffer).

طريقة الاستخدام

أفضل استخدام لها هو لملفات Static, ولكن يمكن استخدامها مع proxy_cache او fastcgi_cache خاصة اذا كنت تستخدم الاخيرين وتحفظ البيانات على الهارديسك بدل من Shared Memory. وهنا سوف اشرح طريقة الاستخدام ملفات ستاتك فقط باستخدام دايركتيف location.

ان كنت تستخدم location معين لملفات الستاتك فالامر شبه جاهز معك وان لم تكن تستخدم يمكن اضافة location التالي في دايركتيف server او الـ virtual host:

location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|js|txt|swf|zip|tgz|gz|rar|pdf)$ {
	root	/path/to/static_files_dir;
}

هنا نحن وضعنا الصيغ مثل css,js,png (يمكنك تغيير الملفات حسب حاجتك) في location معين مع تحديد المسار (غير المسار حسب ماعندك) وبهذا اصبح لدينا الان تحكم اكبر فيها مثل عدم تسجيل الاخطاء لها او ايقاف access log لها ..الخ. الشيء الاخر الذي سوف نقوم به الان هو ضبط خصائص open_file_cache في location هذا ليصبح كالتالي:

location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|js|txt|swf|zip|tgz|gz|rar|pdf)$ {
	root			/path/to/static_files_dir;
	open_file_cache		max=3000 inactive=110s;
	open_file_cache_min_uses 1;
	open_file_cache_valid	120s;
	open_file_cache_errors	off;
}

هنا حددنا اقصى عدد ملفات يبقى مفتوح في الرام هو 3000 الف ملف, اذا تم استخدام الملف مرة واحدة فقط فانه يبقى في الرام وبهذا باستخدام 1, وصالحة الملف 120s اي ثانية وبعدها يصبح منتهي الصلاحية ويغلق, ايضاً يبقى في حالة الخمول او الانتظار لمدة اقصاها 110s, واوقفنا تسجيل الاخطاء عبر off.

نصائح وملاحظات

  • لا تجعل عدد الملفات كبير اكبر من ulimit او قريب منه.
  • لا تجعل وقت الانتظار اكثر من وقت الصلاحية حيث بكل الاحوال الملف سوف يغلق اذا وصل لوقت انتهاء الصلاحية.
  • ايضاً لا تجعل وقت الصلاحية كبير ولا يتجاوز الدقيقتين برايي.
  • عدد مرات الطلب وبعدها يتم تكيش الملف انا وضعتها 1 وهذا جيد اذا كان عليك ضغط كبير غير هذا 2 ~ 5 مناسب حسب الحاجه.
  • في حال وصول عدد الملفات المفتوحة إلى 3000 او حسب الرقم في max فان NGINX تلقائياً سوف يبدأ يغلق اقدم الملفات ليفتح ملفات جديدة بناء على الطلبات.

الفوائد

  • تقليل الضغط على IO (هذا اهم واكبر فائدة تقليل معدل IO يعني سيرفر مستقر اكثر ومتجاوب دائماً، اسألني انا).
  • زيادة سرعة في عملية معالجة الملفات وارسالها للمتصفح (حقيقة ان الامر لن يشعر به الزائر كثيراً لان بشكل عام لا شيء اسرع من NGINX بالتعامل مع الملفات الثابته وان كانت الاعدادات الاساسية!).

السلبيات

  • استخدام وقت Valid عالي بالتالي في حال تعديل الملف او حذفة سوف يستمر كما هو للزوار لحين يصبح timeout.
  • لا تكون ذات فاعلية كبيرة اذا كان لديك رام قليل وفعلياً الرام مستهلك بنسبة كبيرة جداً (استهلاك فعلي وليس ككاش) فهذا قد يتسبب بتخزين ببدا عملية SWAP.
  • ما سبق من سلبيات لا اعتبرها سلبيات سببها NGINX فالاولى سوء اعداد والثانية فقر موارد. 🙂

📮 المتابعة عبر البريد الالكتروني

عند الاشتراك سيصلك جديد منشوراتي ومقالاتي على ايميلك. لا يتم نشر اي اعلانات ابدًا، فقط المقالات التي انشرها هنا في مدونتي هذه.

‎التعليقات‫:‬ 1 On إستخدام open_file_cache في NGINX لتقليل إستهلاك IO وزيادة السرعة

شاركني برأيك