سؤال

لدينا خدمة يميل إلى النوم أثناء الليل على العميل الملقم ثم لديك صعوبة في الاستيقاظ.ما يحدث هو أن عملية كومة ، وهو أحيانا عدة مئات ميغابايت ، هو نقل ملف المبادلة.هذا يحدث في الليل عندما لا يتم استخدام الخدمة ، وغيرها من المقرر تشغيل (DB النسخ الاحتياطي, AV بفحص الخ).عندما يحدث هذا, بعد بضع ساعات من الخمول المكالمة الأولى إلى الخدمة تستغرق ما يصل إلى بضع دقائق (يترتب على ذلك من الدعوات تأخذ ثانية).

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

أتذكر غامضة هناك طريقة لإجبار ويندوز للحفاظ على صفحات الذاكرة الفعلية, ولكن أنا حقا أكره هذه الفكرة.أنا أميل أكثر نحو بعض داخلية أو خارجية الرقابة التي من شأنها الشروع في مستوى أعلى الوظائف (هناك بالفعل بعض الداخلي جدولة التي لم تفعل سوى القليل جدا, و لا فرق).إذا كانت هناك أداة 3rd الطرف التي تقدم هذا النوع من الخدمة هو كان مجرد جيدة.

أحب أن أسمع أي تعليقات أو توصيات و حلول مشتركة إلى هذا النوع من المشاكل.الخدمة هو مكتوب في VC2005 و يعمل على خوادم ويندوز.

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

وأنا لا أقول لك أريد أن أفعل هذا، أو أنه أفضل الممارسات، ولكن قد تجد أنها تعمل بشكل جيد بما فيه الكفاية بالنسبة لك. يبدو أن تتطابق مع ما كنت قد طلبت.

وملخص: لمس كل صفحة في هذه العملية، على الصفحة في وقت واحد، على أساس منتظم

.

وماذا عن موضوع الذي يعمل في الخلفية وتستيقظ مرة واحدة كل N ثواني. في كل مرة يستيقظ الصفحة، فإنه يحاول أن يقرأ من عنوان X. محاولة محمي مع معالج استثناء في حالة تقرأ عنوان سيئة. ثم زيادة X حسب حجم الصفحة.

وهناك 65536 صفحة في 4GB، 49152 صفحة في 3GB، 32768 صفحة في 2GB. تقسيم وقتك الضائع (الوقت الميت بين عشية وضحاها) من خلال عدد المرات التي تريد (محاولة) لضرب كل صفحة.

BYTE *ptr;

ptr = NULL;
while(TRUE)
{
    __try
    {
        BYTE b;

        b = *ptr;
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        // ignore, some pages won't be accessible
    }

    ptr += sizeofVMPage;

    Sleep(N * 1000);
}

ويمكنك الحصول على قيمة sizeOfVMPage من قيمة dwPageSize في النتيجة التي تم إرجاعها من GetSystemInfo ().

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

وبطبيعة الحال، وكنت ترغب في إيقاف هذا الموضوع من خلال النهار، وإلا تشغيله خلال الفترة البالغة الوقت الميت.

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

الشيء الآخر للتأكد من أن البيانات الخاصة بك المترجمة.

وبعبارة أخرى:هل أنت حقا بحاجة إلى كل 300 MiB من الذاكرة قبل أن يمكنك أن تفعل أي شيء ؟ يمكن هياكل البيانات التي تستخدمها يكون ترتيبها بحيث أن أي طلب معين يمكن أن يكون راضيا مع فقط بضعة ميغابايت ؟

على سبيل المثال

  • إذا كان لديك 300 MiB من كومة الذاكرة يحتوي على بيانات التعرف على الوجه.يمكن أن البيانات داخليا تكون مرتبة بحيث الذكور والإناث الوجه البيانات يتم تخزينها معا ؟ أو كبيرة-اللاءات منفصلة من أنفك ؟

  • إذا كان لديه نوعا من البنية المنطقية يمكن أن يكون ذلك فرز?حيث أن البحث الثنائية يمكن استخدامها لتخطي الكثير من الصفحات ؟

  • إذا كان propritary, في الذاكرة, محرك قاعدة البيانات ، يمكن أن يكون أفضل فهرسة/متفاوت لا تتطلب الكثير من الذاكرة صفحة يضرب ؟

  • لو انهم صورة القوام, يمكن أن تستخدم عادة القوام يكون موجودا بالقرب من بعضها البعض ؟

هل أنت حقا بحاجة إلى كل 300 MiB من الذاكرة قبل أن يمكنك أن تفعل أي شيء ؟ لا يمكنك طلب الخدمة دون كل أن البيانات في الذاكرة ؟


خلاف ذلك: المهمة المجدولة في 6 ᴀᴍ أن تستيقظ.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top