mazdadoost
پنج شنبه 19 دی 1387, 13:37 عصر
سلام!
دو ماهی میشه که به شکل مشترک با شرکت گاز در حال کار رویه راه اندازی طرحه حفظت کاتدی خود کار وهوشمند در 80 ایستگاه گاز شهر ... هستیم.
چند هفته ای هست که پروژه وارد فازه پایلوت شده و منهم کلی بیکار شده بودم!(به جز آموزش به چند تا گیگیلی برایه راهبری قسمتی از برنامه که بامن بوده!)
قسمتی که با من بود شامل log کردن پیام هایه سیستم (هر Node سیستم که فعلا فقط 12تاش عملیاتی شده!) رویه سرور راهبری هست که تمام با Log4J پیاده سازی شده.(Remote Appender ,,,). منابع لاگ هم تو فازه پایلوت خیلی زیاده از ردگیری متد هایه برنامه تا پیام هایی که از منابع سخت افزاری طراحی شده برایه کنترل حفاظت کاتدی میان(اون قسمت با JNI پیاده شده) .
تا دیشب مشکلی نبود .حدود ساعت 4 بود که مسئول محترمم خانم ... زنگید به تلفن منزل گفت یه مشکلی پیش اومده برنگ فلان جا کارت دارن!
تماس گرفتم گفت سرور مرکزی از کار افتاده(هنگ فقط مربوط به Jrun بود.).و همونطور که گفتین سرور رو دست نزدیم تا با شما هماهنگی کنیم.گفتم دسش نزنید تا خودم بیام!
رفتم و دیدم :
1-پروسه JVM تقریبا 85 تا 92 درصد CPU تایم رو به خودش اختصاص داده(یکی از چهار هسته بقیه هم بین 10 تا 50 60 درصد درگیر بودن!).
2-Heap وضعیت خوبی داشت و تا 50 درصد و کم و بیش همینقدر بود.
پروفایلر رو نمیتونستم اجرا کنم .تا میخواست به JVM بچسبه سیستم یخ میزد!
تنها کاری که تونستم انجام بدم Dump کردن حافظه JVM بود. و بعدم به پروسه ننگ آورش خاتمه دادم. و رفتم دوباره (خوشبختانه تمام Node ها خودشون میتونن لاگها رودر صورت قعط اتصال به شکل محلی ذخیره کنن و بعد به محض اتصال با سرور مرکزی سینک شن). پروفایلر رو اجرا کردم و سرور رو تو مد Debug بالا اوردم .
همه چیز خوب پیش میرفت . حدود 2 ساعتی سیستم رو Prob کردم و در نهایت رفتم سراغه Snapshot هایه پروفایلر .
متوجه شدم آخرایه Prob فعالیت GC به شکل مسخره ای بالا رفته البته نه در حد هنگ ولی ادامهدار شده.در کل GC یک Heap یک GiG نباید بیشتر از چند ms طول بکشه.اما حدود چند ثانیه طول کشیده بود.
اینجا بود که شکم برد به تنظیمات JVM .
کنسول Jrun روباز کردم و به تنظیمات JVM نگاه کردم! بله سرور با پارامتر –noclassgc اجر شده بود.این پارامتر و چند تا پارامتر دیگه مورد علاقه راهبر Jrun ماست!
–noclassgc رو حذف کردم و سرور رو دوباره تو Debug Mode بالا اوردم. و تا صبح Prob ش کردم.هیچ مشکلی پیش نیومد.چند خطی نوشتم تو دفتره مستندات و رفتم دفتر و یه جستجو در باره –noclassgc کردم.میدونستم کار این پارمتر چیه امامیخواستم ببینم Issue چیزی داره که مشکل پیش اومده!(تمام کلاس هایه برنامه در یه فضایه حافظه جداگانه از Heap به اسم permanent space قرار میگیرند.بعد هر وقت نیاز به شی از اینکلاس باشه JVM از رویه این کلاس هایه کش شده شی رو در Heap ایجادمیکنه. این حافظه هم GC میشه .مگر اینکه JVM رو با پارامتر – noclassgc
اجرا کنیم! اینطوری هیچ کلاسی از permanent space\پاک نمیشه!و permanent space پر میشه) .
چیزی که از جستجوم متوجه شدم این بود که وقتی JVM سان رو با –noclassgc
اجرا میکنیم با پر شدن permanent space جاوا GC رو فراخانی میکنه اما نمیتونه permanent space رو خالی کنه پس میره و اشیائ حذفی Heap روپاک میکنهو دوباره به permanent space نگاه میکنه و باز با دیدن وضعیت permanent space که هیچ تغیری نکردهو پره دوباره Heap رو GC میکنه و تو این چرخه گیر میفته و بعد از یه هنگ درستو حسابی Out of memory میده!
فکر کردم توضیح این تجربه شاید برایه سایر دوستان هم مفید باشه.و چنانه رویه JVM ی غیر از سان کار میکنند شاید اگر با چنین مشکلی مواجه شدن دلشون خواست تو این تاپیک یا تاپیک مشابهی مسئله رو طرح کنند.
موفق باشید.
دو ماهی میشه که به شکل مشترک با شرکت گاز در حال کار رویه راه اندازی طرحه حفظت کاتدی خود کار وهوشمند در 80 ایستگاه گاز شهر ... هستیم.
چند هفته ای هست که پروژه وارد فازه پایلوت شده و منهم کلی بیکار شده بودم!(به جز آموزش به چند تا گیگیلی برایه راهبری قسمتی از برنامه که بامن بوده!)
قسمتی که با من بود شامل log کردن پیام هایه سیستم (هر Node سیستم که فعلا فقط 12تاش عملیاتی شده!) رویه سرور راهبری هست که تمام با Log4J پیاده سازی شده.(Remote Appender ,,,). منابع لاگ هم تو فازه پایلوت خیلی زیاده از ردگیری متد هایه برنامه تا پیام هایی که از منابع سخت افزاری طراحی شده برایه کنترل حفاظت کاتدی میان(اون قسمت با JNI پیاده شده) .
تا دیشب مشکلی نبود .حدود ساعت 4 بود که مسئول محترمم خانم ... زنگید به تلفن منزل گفت یه مشکلی پیش اومده برنگ فلان جا کارت دارن!
تماس گرفتم گفت سرور مرکزی از کار افتاده(هنگ فقط مربوط به Jrun بود.).و همونطور که گفتین سرور رو دست نزدیم تا با شما هماهنگی کنیم.گفتم دسش نزنید تا خودم بیام!
رفتم و دیدم :
1-پروسه JVM تقریبا 85 تا 92 درصد CPU تایم رو به خودش اختصاص داده(یکی از چهار هسته بقیه هم بین 10 تا 50 60 درصد درگیر بودن!).
2-Heap وضعیت خوبی داشت و تا 50 درصد و کم و بیش همینقدر بود.
پروفایلر رو نمیتونستم اجرا کنم .تا میخواست به JVM بچسبه سیستم یخ میزد!
تنها کاری که تونستم انجام بدم Dump کردن حافظه JVM بود. و بعدم به پروسه ننگ آورش خاتمه دادم. و رفتم دوباره (خوشبختانه تمام Node ها خودشون میتونن لاگها رودر صورت قعط اتصال به شکل محلی ذخیره کنن و بعد به محض اتصال با سرور مرکزی سینک شن). پروفایلر رو اجرا کردم و سرور رو تو مد Debug بالا اوردم .
همه چیز خوب پیش میرفت . حدود 2 ساعتی سیستم رو Prob کردم و در نهایت رفتم سراغه Snapshot هایه پروفایلر .
متوجه شدم آخرایه Prob فعالیت GC به شکل مسخره ای بالا رفته البته نه در حد هنگ ولی ادامهدار شده.در کل GC یک Heap یک GiG نباید بیشتر از چند ms طول بکشه.اما حدود چند ثانیه طول کشیده بود.
اینجا بود که شکم برد به تنظیمات JVM .
کنسول Jrun روباز کردم و به تنظیمات JVM نگاه کردم! بله سرور با پارامتر –noclassgc اجر شده بود.این پارامتر و چند تا پارامتر دیگه مورد علاقه راهبر Jrun ماست!
–noclassgc رو حذف کردم و سرور رو دوباره تو Debug Mode بالا اوردم. و تا صبح Prob ش کردم.هیچ مشکلی پیش نیومد.چند خطی نوشتم تو دفتره مستندات و رفتم دفتر و یه جستجو در باره –noclassgc کردم.میدونستم کار این پارمتر چیه امامیخواستم ببینم Issue چیزی داره که مشکل پیش اومده!(تمام کلاس هایه برنامه در یه فضایه حافظه جداگانه از Heap به اسم permanent space قرار میگیرند.بعد هر وقت نیاز به شی از اینکلاس باشه JVM از رویه این کلاس هایه کش شده شی رو در Heap ایجادمیکنه. این حافظه هم GC میشه .مگر اینکه JVM رو با پارامتر – noclassgc
اجرا کنیم! اینطوری هیچ کلاسی از permanent space\پاک نمیشه!و permanent space پر میشه) .
چیزی که از جستجوم متوجه شدم این بود که وقتی JVM سان رو با –noclassgc
اجرا میکنیم با پر شدن permanent space جاوا GC رو فراخانی میکنه اما نمیتونه permanent space رو خالی کنه پس میره و اشیائ حذفی Heap روپاک میکنهو دوباره به permanent space نگاه میکنه و باز با دیدن وضعیت permanent space که هیچ تغیری نکردهو پره دوباره Heap رو GC میکنه و تو این چرخه گیر میفته و بعد از یه هنگ درستو حسابی Out of memory میده!
فکر کردم توضیح این تجربه شاید برایه سایر دوستان هم مفید باشه.و چنانه رویه JVM ی غیر از سان کار میکنند شاید اگر با چنین مشکلی مواجه شدن دلشون خواست تو این تاپیک یا تاپیک مشابهی مسئله رو طرح کنند.
موفق باشید.