2011-01-12 41 views
10

Tôi hiểu một trong những nguyên nhân chính gây ra Chỉ số bên ngoài lỗi giới hạn cho đối tượng Từ điển là xung đột chuỗi. (Đọc và viết vào cùng một từ điển cùng một lúc) Tuy nhiên, tôi đã bắt gặp một trường hợp rắc rối khi va chạm thread không phải là một lời giải thích đầy đủ.Các nguyên nhân thay thế cho chỉ mục nằm ngoài giới hạn của mảng trong từ điển .Net

Đây là tình huống: Tôi đã viết mã thực hiện Từ điển theo cách không an toàn để xử lý đa luồng.

Mã đã được triển khai dưới dạng dịch vụ web trên hai máy chủ, máy chủ A và máy chủ B. Các máy chủ được truy cập thông qua bộ cân bằng tải sẽ gửi yêu cầu đến máy chủ A và B theo kiểu vòng tròn.

Bây giờ, đây là phần khó khăn. Lỗi này chỉ hiển thị trên máy chủ A và không bao giờ ở trên máy chủ B. Theo nhóm phần cứng của chúng tôi, cả hai máy chủ đều giống nhau. Mặc dù thread collision vốn dĩ là một quá trình ngẫu nhiên, nó vẫn sẽ ảnh hưởng đến cả hai máy chủ của tôi như nhau. Tôi thấy hơn 50 trường hợp lỗi trên một máy chủ và 0 trường hợp trên một máy chủ khác. Đó là thống kê không chắc rằng các va chạm thread chỉ xảy ra trên một trong các máy chủ của tôi trong khi một trong những khác đang chạy lỗi miễn phí.

Tôi đã sửa đổi ứng dụng để làm cho chuỗi này an toàn hơn, nhưng những lý do nào khác có thể tồn tại cho lỗi này sẽ được ném trong khi trong hoạt động Chèn của đối tượng Từ điển?

+0

Bạn có chắc là trình cân bằng tải gửi yêu cầu đến Máy chủ B không? Có thể nó chỉ ảnh hưởng đến máy chủ đầu tiên. –

+0

Có lẽ một máy chủ có hệ điều hành 32 bit và một máy chủ khác có 64 bit? –

+0

@ petro.sidlovskyy Tôi đã xác nhận rằng cả hai máy chủ đều có lưu lượng truy cập dựa trên tệp nhật ký – Joshua

Trả lời

7

Mặc dù chủ đề va chạm là vốn dĩ là một quá trình ngẫu nhiên

Không gì cả. Nó phụ thuộc rất nhiều vào thời gian. Và thời gian có thể lặp lại, các hệ thống có xu hướng giải quyết thành các mẫu cụ thể.Một công cụ chẩn đoán cuộc đua chủ đề như CHESS của Microsoft Research hoạt động bằng cách tiêm các sự chậm trễ ngẫu nhiên vào việc thực hiện một luồng. Để có được hệ thống rơi ra khỏi một mô hình như vậy. Giống như nó thỉnh thoảng tự làm, nhưng chỉ một lần một tuần hoặc lâu hơn. Điều đó là ngẫu nhiên, không đủ ngẫu nhiên để có thể cho bạn một cú pháp gỡ rối vấn đề.

Vì vậy, thấy một máy chủ bị lỗi và không phải máy chủ khác không có nghĩa là bất kỳ điều gì. Cân bằng tải có thể có liên quan đến nó. Bạn sẽ không bao giờ có thể tìm ra lý do chính xác bởi vì bạn không thể tìm ra những gì đã xảy ra 50 lần đó. Nó không đủ.

1

Điều này có thể được tìm nạp nhiều, nhưng bạn có biết liệu các kết nối của mình với hai máy chủ thông qua bộ cân bằng tải có bằng nhau hay không? (Tôi thực sự không biết gì về việc cân bằng tải hoạt động như thế nào, vì vậy đây có thể là một suy nghĩ ngu ngốc từ khi bắt đầu.)

Tôi chỉ nghĩ rằng bạn có độ trễ mạng nhiều hơn trong kết nối với Máy chủ B so với Server A. Điều này có thể cung cấp đủ khoảng cách giữa các yêu cầu của máy khách trên máy chủ đó dẫn đến việc truy cập từ điển, cho phép bạn thoát khỏi mã đa luồng của bạn mà không nói một cách nghiêm ngặt.

Nếu yêu cầu đến Server Nhanh hơn một chút, điều này có thể tạo ra sự khác biệt cho bạn lỗi ngoài phạm vi.

Giống như tôi đã nói, có lẽ rất xa vời — chỉ là một ý tưởng. Tôi nghĩ rằng nó không thể làm tổn thương để ném nó ra khỏi đó.

0

Tôi không thể giải thích lý do tại sao nó không hoạt động ở một máy chủ nhưng không hoạt động ở một máy chủ khác. Tuy nhiên, các vấn đề của bạn là các vấn đề đa luồng.

Như bạn có thể đã nhận thấy, điều này sẽ không hoạt động khi trong một môi trường đa luồng:

if (!dict.ContainsKey("myKey")) 
    dict.Add("myKey", value); 

Cùng đi với:

if (dict.ContainsKey("myKey")) 
    return dict["myKey"]; 

gì có thể ngạc nhiên bạn là TryGetValue không phải là thread an toàn hoặc:

MyObject obj; 
return dict.TryGetValue("myKey", out obj) ? obj : null; 

Tham chiếu: http://www.grumpydev.com/2010/02/25/thread-safe-dictionarytkeytvalue/

+0

Nó sẽ không thực sự làm bạn ngạc nhiên vì chúng không phải là bộ sưu tập an toàn chủ đề trong trường hợp đầu tiên? – Kurru

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