ورود

View Full Version : حرفه ای: چه طور میشه میزان استفاده برنامه از منابع سخت افزاری سیستم رو اندازه گرفت؟



[younes]
شنبه 04 مرداد 1393, 22:54 عصر
درود

چه طور میشه منابع مصرفی توسط برنامه جاوایی را اندازه گرفت؟

به طور واضح تر اگه بخوام بگم من یه برنامه جاوا دارم که به صورت چند نخی اجرا میشه و بروی وب هست چون منابع من در سرور محدود هست میخواهم یه کلاس جدید بنویسم که منابع مصرفی مثل رم و cpu برنامه رو مدام زیر نظر داشته باشه تا درخواست های محدودی بپذیره و ما بقی رو در صف نگه داره


چه راه حلی پیشنهاد میکنید؟

محمد فدوی
یک شنبه 05 مرداد 1393, 10:11 صبح
اینو (http://stackoverflow.com/questions/74674/how-to-do-i-check-cpu-and-memory-usage-in-java) بخون. هم در مورد چگونگی استخراج فضای خالی JVM و هم در مورد سیستم توش توضیح دادن. اگرم منظورت Performance Test بود اینو (http://www.vogella.com/tutorials/JavaPerformance/article.html) بخون.
موفق باشی.

cups_of_java
یک شنبه 05 مرداد 1393, 10:14 صبح
بحث monitoring منابع سیستم یه چیزه... که API گرفتن مقادیر حافظه و بار پردازشگر و ... این ها در جاوا هست... همینطور برنامه ها و toolsهایی هست که خودشون همه این کار ها رو انجام میدن حتی alarm هم می دن با ایمیل به شما....

اما اینکه بخواید برنامتون یه چیزی مثل شیر کنترل داشته باشه که بتونین اون رو باز و بسته کنید... یا باید خودتون از یک صف در برنامه استفاده کنید... یا از لایبرری های صف (Job Queue) در جاوا استفاده کنید.... اینطوری می تونید میزان توازی (بار پردازشگر) و میزان بار برنامه رو کنترل کنید.

ahmad.mo74
یک شنبه 05 مرداد 1393, 11:10 صبح
سلام، به نظر من قبل از هر چیز بهینه سازی باید تو کد ها انجام بشه، از رعایت کردن قوانین آبجکت اورینتد گرفته تا انتخاب فیلد ها نحوه به کاری گیری و... یه سرور رو میشه طوری نوشت که 20 30% رم و cpu رو بگیره ولی حتی نتونه جوابگوی 100 تا درخواست در ثانیه باشه اما همون سرور رو اگه درست و اصولی کد بزنی میتونه تنها با مصرف 60 70 مگ رم و 2 3% از cpu تا 5000 6000 درخواست بر ثانیه هم جواب بده...در مورد مالتی ترد بودن هم در حال حاضر خیلی لایبرری های خوب و بهینه ای برای برنامه های مالتی ترد تو جاوا هست که واقعا هم سریع تر میکنه برنامه رو هم خیلی کم مصرف تر مثل ExecutorService مثل ForkJoinPool که خیلی عالیه و روی همون ExecutorService پیاده سازی شده...شما الان برنامتو تست کن و بزار که به مدت نیم ساعت یا بیشتر کار کنه و مدام بهش درخواست بده و جواب بگیر یا اگه با junit کار کنی بهتره حتی mock هم خوبه... و با یه تسک منیجری مصرف رم و cpu رو زیرنظر داشته باش، اگر به تدریج در حال اضافه شدن به مصرف رم باشه مثلا از 60 مگ شروع کرده و بعد نیم ساعت کار رسیده به 200 300 مطمئن باش خیلی کدهای بدی زدی و باید درست کنی ولی اگر ثابت باشه یعنی همچین بد هم کد نزدی :)) ... به هر حال به نظر من خیلی به این کار نیازی نیست که تعداد درخواست برنامتو محدود کنی و همین که مدام بخوای رم و cpu رو تو برنامت اندازه بگیری همین خودش میشه یه کار اضافه مصرفو میبره بالاتر. در ضمن شما از چه web server ای استفاده میکنی؟ این هم میتونه مهم باشه...موفق باشی :)

dasssnj
یک شنبه 05 مرداد 1393, 11:49 صبح
دوستان چطور میشه فهمید فقط برنامه ی خودم چقدر از رم را پر کرده؟

ahmad.mo74
یک شنبه 05 مرداد 1393, 12:02 عصر
فکر کنم با jconsole میشد...دقیقا یادم نیست

dasssnj
یک شنبه 05 مرداد 1393, 12:28 عصر
این که گفتین را میشه توی برناممون اضافه کنیم؟
می خوام یه منو ایتم داشته باشم که میزان رم مصرفی برنامه را نشون بده.

vahid-p
یک شنبه 05 مرداد 1393, 16:57 عصر
می خوام یه منو ایتم داشته باشم که میزان رم مصرفی برنامه را نشون بده.

خب مثلا این کد :
Runtime.getRuntime().totalMemory()
شبیه همین برای freeMemory , maxMemory هم هست.

ولی خب این دقیق نیست، و فکر میکنم فضای Heap اشغالی رو نشون میده ( همونش هم با اطلاعات JVM متفاوته ). شما احتمالا فضای استفاده رو میخواید. که نمیدونم چطوری از طریق برنامه بشه بدست آورد.
ولی برای خودت که برنامه رو چک کنی، فکر میکنم Java VisualVM که همراه با هر JDK ای وجود داره خیلی خوب باشه ( کافیه تو Start Menu اسمشو سرچ کنید ). نمودار استفاده از رم و سی پی یو هم براتون رسم میکنه.

dasssnj
یک شنبه 05 مرداد 1393, 19:10 عصر
می خوام برنامم میزان مصرف رم توسط خودش را بتونه نشون بده . مثل برنامه ی tide . هر چی گشتم چیزی نفهمیدم.

ahmad.mo74
یک شنبه 05 مرداد 1393, 21:20 عصر
مگر اینکه سورس jconsole یا visualVM رو گیر بیاری ببینی چیکار کردن...منم راهی نمیشناسم برای فهمیدن میزان مصرف برنامه تو خودش!