2011-10-19 17 views
9

Tôi có một bãi chứa sự cố từ ứng dụng của tôi hiển thị một loạt các chuỗi đang chờ trên một syncblk và syncblk cho thấy rằng nó không có chủ đề riêng. Làm thế nào là có thể? Tôi đang cố gắng tái tạo các triệu chứng trong một ứng dụng thử nghiệm, và tôi không thể tìm ra những gì có thể xảy ra để tạo ra kết quả đó .... có việc thoát khỏi chuỗi chủ sở hữu hoặc chết mà không phát hành syncblk vẫn hiển thị như đang sở hữu đối tượng , chỉ là threadid là "XXX" .... Tôi đã thử nghiệm bằng cách sử dụng hoàn toàn quản lý duyên dáng xuất cảnh và chấm dứt chủ đề cứng thông qua pinvoke .... Tôi đã thử nghiệm một loạt các kết hợp khác nhau của chờ đợi mà không có xung, không khớp vào và thoát ... không có gì tạo ra một syncblk mà khối chủ đề và cho thấy không có chủ sở hữu ..... Tôi đang chạy ra khỏi ý tưởngChủ đề .NET có thể chờ đợi như thế nào trên một syncblk không thuộc sở hữu của bất kỳ chủ đề nào?

Đây là đầu ra từ crashdump của tôi mà tôi đang cố gắng để nhân rộng: (Lưu ý chỉ số # 1236)

0:000> !syncblk 
Index   SyncBlock MonitorHeld Recursion Owning Thread Info   SyncBlock Owner 
784 0000000004f12eb0   3   1 000000000508a460 32a8 68 00000001a0a20510 
966 0000000004f06928   1   1 00000000052c5da0 2380 114 00000001df3080f8 
1085 0000000004f23088   1   1 00000000052c8080 496c 120 00000001a0325238 
1144 0000000005160d20   1   1 00000000050968b0 d74 56 00000000ff61b570 
1151 0000000004f0c2c8   1   1 000000000508d8b0 3f64 77 000000017f66dc20 
1236 0000000004f0b4f8   16   0 0000000000000000  none 000000019f1ec5d8 
1261 0000000004f0ffe8   1   1 0000000008f18fc0 446c 94 000000013f8e70b0 
1306 0000000004f0e918   1   1 00000000052c91f0 406c 123 000000011f5936f8 
1318 0000000004f0e528   3   1 0000000008f1d580 24d8 106 000000015fc73f28 
1329 0000000004f0cc58   1   1 0000000005095740 2fbc 53 000000011f36d320 
1332 0000000004f15b38   1   1 0000000008f16710 3804 87 000000019f964728 
1387 0000000004f22350   1   1 0000000008f18420 5180 92 00000001a008ab08 
1515 0000000004f1d5d0   1   1 00000000052c4c30 2b5c 111 00000000ffd3c068 
1594 0000000004f19bc0   1   1 000000000508ea20 188c 80 000000012012c538 
1660 0000000004f13608   1   1 00000000050892f0 32fc 65 00000001df800940 
1682 00000000051608a0   1   1 000000000508c740 1d58 74 00000001bfa03d20 
1746 0000000004f14e88   1   1 0000000008f1c9e0 e88 104 000000015f6fcd10 
1883 0000000004f19938   1   1 0000000005092e90 27c4 46 00000000ff76d2b0 
1886 0000000004f1b760   1   1 0000000008f19b60 2dd4 96 000000019fc07030 
2036 0000000004f1ae10   1   1 0000000008f1be40 4f58 102 00000001dfcb9da8 
2042 0000000004f12e68   1   1 00000000052c8c20 2300 122 000000015f6aaa98 
2049 0000000004f1cda0   1   1 00000000052c9d90 1948 126 00000001df6fd688 
2153 0000000004f16d88   1   1 0000000005094ba0 3f04 51 00000000ff677eb8 
2262 0000000004f13de8   3   1 00000000052ca360 6fc 127 000000011fd7a450 
2358 00000000050fc390   1   1 0000000009221280 3ca0 130 0000000120055ca0 
----------------------------- 
Total   2553 
CCW    3 
RCW    2 
ComClassFactory 0 
Free   1212 

Trả lời

7

SyncBlock 000000019f1ec5d8 là không có chủ sở hữu. Cũng là người duy nhất có số lượng thậm chí là MonitorHeld. Kể từ khi MonitorHeld tăng with 1 for the owner and 2 for each waiter dự đoán của tôi sẽ là đây là tài nguyên được phát hành ngay trước khi bãi chứa được thực hiện và chưa được cấp một chủ sở hữu mới. Tài nguyên không lành mạnh báo hiệu tất cả các bồi bàn khi được thả và những người phục vụ vội vàng mua lại nó (hành vi không công bằng này tránh được ổ khóa đoàn kết). Cho đến khi các bồi bàn được lên kế hoạch và chạy, và người phục vụ đầu tiên lấy tài nguyên, sẽ không có chủ sở hữu.

Xem thêm A high waiter count on a free critical section may indicate a lock convoy:

Nếu bạn đang gỡ một vấn đề hiệu suất trong ứng dụng của bạn, bạn có thể chạy xuyên qua một phần quan trọng trong tình trạng rất lạ: Rất nhiều đề đang chờ đợi nó, nhưng không ai sở hữu nó!

...

Trạng thái này có nghĩa là chủ sở hữu trước đây của bộ phận quan trọng có chỉ thoát nó và hiệu a thread chờ đợi để lấy nó, nhưng điều đó chủ đề vẫn chưa nhận được một cơ hội để chạy chưa

+1

Yup. Hoặc các chủ đề bị chặn trên một GC. Luôn luôn có khả năng để có một bãi rác. –

+0

Cảm ơn Remus .... đọc lên trên các đoàn tàu khóa một chút, và nó mô tả chính xác những gì tôi nhìn thấy hoàn toàn hoàn hảo. Ứng dụng dường như treo, và CPU được ghim ở mức 100%, nhưng nếu tôi đổ tất cả các chủ đề xuất hiện để chờ đợi để có được khóa đó ... không có vẻ như đang thực hiện ở tất cả, và nếu tôi làm một! tải CPU được trải đều trên tất cả các luồng. Cảm ơn nhiều! – redec

1

Nội dung bạn mô tả có thể đã bị xóa lý do ral:

  • Sở hữu chủ đề đã ổn định với một số vi phạm truy cập khó chịu
  • Sở hữu chủ đề đã ổn định với OutOfMemoryExceptions
  • Một số phần của hệ thống (như một người lái xe ...) gây ra một tình huống kỳ lạ
  • Một số thư viện của bên thứ ba sử dụng mã gốc khiến quy trình trở nên không ổn định
  • Một số phần quan trọng của khung (như quản lý/quản lý luồng/quản lý bộ nhớ GC) không ổn định và/hoặc đã chết trong khi đang hoạt động quan trọng

Bất kỳ những điều trên là khá khó khăn để tái sản xuất ...

Đối với một bản tóm tắt tốt đẹp trên syncblk thấy http://blogs.msdn.com/b/tess/archive/2006/01/09/a-hang-scenario-locks-and-critical-sections.aspx

0

Khả năng 1: syncblk sẽ bị xóa và tiếp theo trong số 16 chủ đề sẽ lấy nó ngay sau khi được lên lịch lại. Khả năng 2: Bạn có bộ nhớ bị hỏng.

Các vấn đề liên quan