1 ضمیمه
وقتی چند پروسه از این برنامه با هم اجرا میشوند، برنامه هنگ میکند؟ چرا؟
سلام دوستان
من یک برنامه Windows دارم که بخشی از آن به زبان C# MS .NET Framework نوشتم ولی هسته اصلی آن که کار را انجام میدهد توسط شخص دیگری به زبان Win32 نوشته شده است.
مشکلی که در اجرای آن میبینم مربوط به سرعت آن میشود. به خاطر نیاز ما لازم است چند تا از این برنامه در سیستم عامل مان در کنار هم اجرا شوند. البته من هر کدام را با یک حساب کاربر Windows Account اختصاصی اجرا کرده ام (با TaskScheduler میتوان این کار را کرد).
وقتی درخواستی به یکی از آن برنامه محول میشود، در کامپیوتر خودم (Win10) که برای برنامه نویسی است، فوری CPU به 100% میرود و کار شروع میشود ولی در کامپیوتر سرور که مشکل ما در آن اتفاق میافتد، در مواقعی اول Disk Activity به 100% میرسد بعد از چند دقیقه به حالت نرمال برمیگردد و بعدCPU به 100% میرود و کار اصلی از آن موقع شروع میشود. این مشکل همیشه اتفاق نمیافتد و همین کار اشکال یابی را مشکل میکند.
من در لحظه کار نکردن برنامه در Resource Monitor دیدم مثل اینکه چند پروسه از این برنامه من که اسمش را SDLAutomation.Console.exe گذاشته ام سر PageFile با هم رقابت میکنند، چون از عکسی که گرفتم این را نشان میدهد:
ضمیمه 150972
سیستم عامل سرور ما WindowsServer 2012 است. من حدس میزنم دوستانی که به زبان ++C آشنا هستند شاید بتوانند با تنظیم سیستم عامل کاری کنند که حافظه ها یا همان Pagefile ها تداخل نکنند. مثلا در صفحه
System Properties--> Advanced --> Performance Options ---> Data Execution Prevention
به این تنظیم مشکوک هستم. بخصوص که پیش فرض این تنظیم در Windows Server با Windows 10 فرق میکند و در اولی برای همه برنامهها فعال است.
----
با برنامه مخصوص debug به نام DebugDiag که وضعیت برنامه را در لحظه خطا نشان میدهد گزارشی تهیه کردم ، که قسمت warningی دارد که میگوید:
Warning
Number of objects ready for finalization: 476
Description Recommendation
This is an indication that your finalizer thread may be blocked. Look at finalizequeue info and finalizer stack to determine why/if the finalizer is blocked
نقل قول: وقتی چند پروسه از این برنامه با هم اجرا میشوند، برنامه هنگ میکند؟ چرا؟
سلام
مصرف بالای Pagefile یعنی یکی از موارد زیر:
1- برنامه تون رم بیشتری برا کار کردن نیاز داره .در این مواقع تنها راه حل تهیه رم بیشتر هستش.تنظیمات رو این مورد تاثیر مثبت ندارن.چیزی رو تغییر ندید.
2- برنامه تون مشکل مدیریت منابع(حافظه) داره که من حدس میزنم مشکل همین هستش. تو زبان های مدیریت شده مثل سی شارپ هم احتمال نشت حافظه یا منابع دیگر هستش. کنترل منابع آسون تر هستش ولی بلاخره نیازه.
در مورد مصرف بالای cpu :
ممکنه در کدتون spin-wait دارید یعنی یک حلقه بی نهایت دارید در جایی از برنامه .
اگر برنامه چند نخی هستش باید از توابع synchronization استفاده کنید تا مصرف به 100 نرسه.
اما در کل حل همچین مشکلی حداقل به کد کامل هر دو برنامه نیازه. به علاوه داشتن دسترسی به محیط اجرای برنامه هم تاثیر مثبتی داره .
شما که هیچ اطلاعاتی رو قرار ندادید و این کار رو خیلی سخت میکنه . با این وجود موارد بالا رو در نظر داشته بشید شاید مشکلتون حل شد.
نقل قول: وقتی چند پروسه از این برنامه با هم اجرا میشوند، برنامه هنگ میکند؟ چرا؟
از راهنماییتان خیلی ممنون
من در این چند روز که از طرح سوال میگذرد یک به یک احتمالهایی که خودم در بالا داده بودم را رد کردم و فهمیدم که دلیل اشکال نیستند.
من هم با نظر شما موافقم که مشکل مدیریت منابع(حافظه) داریم. این برنامه مثل یک service است (یک exe معمولی است که با روشن شدن کامپیوتر، اجرا میشود) و همیشه اجرا است، هر وقت کاری بیاید انجام میدهد وگرنه منتظر میماند. به نظرم باید سر زمانهایی برنامه را reset کنیم.
نقل قول: وقتی چند پروسه از این برنامه با هم اجرا میشوند، برنامه هنگ میکند؟ چرا؟
نقل قول:
نوشته شده توسط
Esikhoob
از راهنماییتان خیلی ممنون
من در این چند روز که از طرح سوال میگذرد یک به یک احتمالهایی که خودم در بالا داده بودم را رد کردم و فهمیدم که دلیل اشکال نیستند.
من هم با نظر شما موافقم که مشکل مدیریت منابع(حافظه) داریم. این برنامه مثل یک service است (یک exe معمولی است که با روشن شدن کامپیوتر، اجرا میشود) و همیشه اجرا است، هر وقت کاری بیاید انجام میدهد وگرنه منتظر میماند. به نظرم باید سر زمانهایی برنامه را reset کنیم.
ابزار برا کنترل و مانیتورینگ برنامه برا ویندوز کم یاب نیست .تشخیص نشت حافظه service تون با این ابزار ها وقعا کار سختی نیست .
ریست کردن که نشد راه حل !
نقل قول: وقتی چند پروسه از این برنامه با هم اجرا میشوند، برنامه هنگ میکند؟ چرا؟
نقل قول:
نوشته شده توسط
pe32_64
. . . . ریست کردن که نشد راه حل !
بله، من سابقه برنامه نویسی زیاد دارم، ولی تا به حال حتی یک خط هم با ++C ننوشتم و با نشت حافظه بیگانه ام؛ اما در کار با Windows مهارت بسیار دارم و به یادگیری ++C علاقه بسیاری دارم، برای همین است که از موقع پرسیدن این سوال تا به حال در حال آموزش و مونیتور کردن حافظه Windows با همین ابزارهای مونیتورینگ هستم و به راه حل ساده ریست کردن بسنده نکردم. خوشحالم که میبینم این کار من از دید برنامه نویسان ++C هم درست است.
الان با برنامه Windbg در لحظه hang این برنامه این اطلاعات را بدست آوردم:
0:012> !threads
ThreadCount: 32
UnstartedThread: 0
BackgroundThread: 5
PendingThread: 0
DeadThread: 26
Hosted Runtime: no
Lock
ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
0 1 a54 007642d8 2a020 Preemptive 55A1C7AC:00000000 0075e860 0 MTA
2 2 848 00774008 2b220 Preemptive 00000000:00000000 0075e860 0 MTA (Finalizer)
3 3 f34 03b287a8 8029220 Preemptive 00000000:00000000 0075e860 0 MTA (Threadpool Completion Port)
4 4 10b4 03c0aef0 102a220 Preemptive 00000000:00000000 0075e860 0 MTA (Threadpool Worker)
8 6 f04 03baa5c0 1020220 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 41 0 00771840 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 47 0 007722d0 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 27 0 00770db0 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 31 0 00771d88 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 46 0 00770868 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 32 0 007712f8 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 21 0 15a57560 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 5 0 15a5aa30 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 19 0 15a56588 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 45 0 15a555b0 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 26 0 15a55af8 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 48 0 15a57ff0 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 40 0 15a57018 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 38 0 15a54b20 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 13 0 15a59fa0 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 23 0 15a55068 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 15 0 15a59a58 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 35 0 15a5a4e8 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 17 0 15a56040 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 8 0 15a57aa8 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 12 0 15a58538 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 30 0 15a58a80 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 14 0 15a530b8 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 20 0 15a56ad0 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
XXXX 28 0 15a58fc8 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
11 16 df8 15a53b48 21220 Cooperative 00000000:00000000 0075e860 0 Ukn
XXXX 33 0 15a53600 1039820 Preemptive 00000000:00000000 0075e860 0 Ukn (Threadpool Worker)
0:012> !syncblk
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner
-----------------------------
Total 181
CCW 7
RCW 10
ComClassFactory 1
Free 115
0:012> !DumpHeap -type Interop
Address MT Size
01158e78 72e1ef94 12
01158ff4 72e1ef94 12
0115907c 72e1ef94 12
.
.
.
011590f0 72e1ef94 12
558390f8 0c8b87a4 12
55839ac4 0c8b87a4 12
55839adc 0cc930e8 32
55842344 0c8b87a4 12
55842350 0cc954b8 36
55842bec 0c8b87a4 12
558432cc 0c8b87a4 12
55a1c740 72e39ef4 12
Statistics:
MT Count TotalSize Class Name
72e1edb0 1 12 System.Runtime.InteropServices.GuidAttribute
042ebe54 1 16 SolidFramework.Interop.StringMarshaler
03e8cb1c 1 16 Sdl.MultiTerm.Common.Interop.MtCommonClass
03e8c138 1 16 Sdl.MultiTerm.Server.Interop.MtUtilityClass
03e8ae80 1 16 Sdl.MultiTerm.Server.Interop.MtCatalogServerClass
03e8a9b8 1 16 Sdl.MultiTerm.Server.Interop.MtServerClass
72e39ef4 2 24 System.Runtime.InteropServices.GCHandle
6c8b3850 1 32 System.Runtime.Interop.UnsafeNativeMethods+EtwEnab leCallback
03e8cdc0 2 32 Sdl.MultiTerm.Server.Interop.MtSearchCountClass
03e8bf78 2 32 Sdl.MultiTerm.Server.Interop.MtSearchExClass
03e8bbc0 2 32 Sdl.MultiTerm.Server.Interop.MtTermbaseClass
72e3792c 3 48 System.Runtime.InteropServices.HandleRef
72e1ef94 14 168 System.Runtime.InteropServices.ComVisibleAttribute
0cc930e8 188 6016 Sdl.FileTypeSupport.Filters.MicrosoftOffice.Previe w.PowerPoint.PowerPointInteropFacade
0cc954b8 282 10152 Sdl.FileTypeSupport.Filters.MicrosoftOffice.Previe w.Excel.ExcelInteropFacade
0c8b87a4 846 10152 Sdl.FileTypeSupport.Filters.MicrosoftOffice.Previe w.Helpers.OfficeInteropLoader
Total 1348 objects
من در تفسیر این مطالب عاجزم، آیا تعداد DeadThread: 26 طبیعی است؟
با CCW 7 و RCW 10 باید چه کار کرد؟