2017-01-02 22 views
5

Tôi có ứng dụng ASP.NET đơn giản chỉ thay đổi kích thước hình ảnh với ImageResizer và không làm gì khác. Đối với mục đích thử nghiệm, tôi vô hiệu hóa bộ nhớ đệm đĩa, do đó, hình ảnh được thay đổi kích cỡ theo mọi yêu cầu.IIS 8.5 quy trình công nhân đơn lẻ so với hiệu suất Web Garden

Khi tôi kiểm tra hiệu suất của các ứng dụng với JMeter tôi nhận được những thời điểm sau trung bình phản ứng:

  • quá trình duy nhất người lao động, 1 khách hàng đồng thời: ~ 200ms
  • quá trình lao động duy nhất, 10 khách hàng đồng thời: ~ 1200ms
  • 4 quá trình lao động, 10 khách hàng đồng thời: ~ 300ms

Như bạn có thể thấy, khi tôi chạy quá trình công nhân độc thân và 10 khách hàng đồng thời, thời gian đáp ứng tăng dr amatically mặc dù tài nguyên phần cứng có sẵn: CPU sử dụng trong quá trình thử nghiệm hiệu suất là ~ 30%, sử dụng bộ nhớ là ~ 150MB.

Như đã thảo luận here,

vườn Web được thiết kế cho một lý do duy nhất - Cung cấp các ứng dụng mà không phải là CPU-bound nhưng thực thi chạy dài yêu cầu khả năng để mở rộng và không sử dụng hết tất cả các chủ đề có sẵn trong quy trình công nhân.

Đây không phải là trường hợp của tôi.

Vì vậy, tôi không hiểu tại sao tôi nhận được kết quả như vậy. Điều tôi mong đợi là ngay cả quy trình công nhân đơn lẻ cũng sẽ cung cấp thời gian phản hồi có thể chấp nhận được cho đến khi đạt đến giới hạn tài nguyên. Và 10 khách hàng đồng thời là defenitely không phải là một tải nặng. Ai đó có thể giải thích cho tôi, tôi đang sai ở đâu?

cấu hình của tôi:

  • Windows Server 2012 R2
  • IIS 8.5 với tất cả các thiết lập mặc định (trừ MaxWorkerThreads)
  • quad-core i3 3,4 GHz CPU
  • 16 GB RAM

Ứng dụng của tôi chỉ là ứng dụng ASP.NET MVC trống với ImageResizer, được thêm vào như trong this instruction (tùy chọn 3 - Hướng dẫn sử dụng I nstallation) và với DiskCache plugin bị vô hiệu hóa trong Web.config

+1

Chỉ dựa trên những số bạn đã cung cấp và không biết gì về ImageResizer, có vẻ như ImageResizer đang chạy thay đổi kích thước hoạt động chỉ trong một lần ead, có thể là STA? Điều này (đầu cơ) có thể là trường hợp nếu nó được dựa trên một thành phần COM mà không hỗ trợ nhiều chủ đề. – Ben

Trả lời

3

Tôi tìm thấy câu trả lời nhờ nhận xét của @ Ben.

Vấn đề là ImageResizer dựa trên GDI + (như đã nêu trên it's site), có chứa các khóa bên trong (xem thisthis bài đăng để biết chi tiết). Đây là lý do tại sao nó hoạt động rất chậm trong một quá trình.

Sau khi tìm nguyên nhân gây ra sự cố, tôi đã thử this solution. Tham khảo các hội đồng WPF từ ứng dụng ASP.NET, có lẽ, không phải là một ý tưởng tốt nhất, nhưng nó là ok cho các mục đích thử nghiệm.

Bây giờ tôi nhận được kết quả như sau khi tôi thực hiện các thử nghiệm hiệu năng giống như trong câu hỏi:

  • quá trình duy nhất người lao động, 1 khách hàng đồng thời: ~ 90ms
  • quá trình lao động duy nhất, 10 khách hàng đồng thời: ~ 120ms
  • quá trình lao động duy nhất, 40 khách hàng đồng thời: ~ 190ms
  • quá trình duy nhất công nhân, 60 khách hàng đồng thời: ~ 400ms
  • quá trình lao động duy nhất, 80 khách hàng đồng thời: ~ 630ms

Như bạn thấy, hiện tại, ứng dụng hoạt động nhanh hơn nhiều. Ngoài ra nó sử dụng gần như tất cả các tài nguyên CPU có sẵn dưới tải cao, như tôi mong đợi ban đầu.

Vì vậy, nếu bạn xử lý hình ảnh trong ứng dụng ASP.NET của bạn:

  • không sử dụng GDI + dựa trên giải pháp, nếu bạn có thể
  • nếu bạn phải sử dụng GDI +, tăng MaxWorkerProcesses trong applicaion cài đặt của hồ bơi
Các vấn đề liên quan