2008-12-10 29 views
7

Trên máy của tôi (XP, 64) quy trình nhân viên ASP.net (w3wp.exe) luôn khởi chạy với bộ nhớ ảo 5.5GB được đặt trước. Điều này xảy ra bất kể ứng dụng web mà nó lưu trữ (nó có thể là bất cứ điều gì, ngay cả một trang web trống trong aspx).Xác định ai/dung lượng bộ nhớ ảo 5.5 GB trong w3wp.exe

Bộ nhớ ảo lớn tuổi này được dành riêng tại thời điểm quá trình bắt đầu, vì vậy đây không phải là bộ nhớ "rò rỉ" dần dần của một số loại.

Một số tìm hiểu xung quanh với windbg cho thấy bộ nhớ là câu hỏi riêng tư, dành riêng và RegionUsageIsVAD, cho biết đó có thể là tác phẩm của ai đó đang gọi VirtualAlloc. Nó cũng cho thấy rằng bộ nhớ trong câu hỏi được phân bổ/dành riêng trong 4 khối lớn của 1GB mỗi và một số nhỏ hơn một (1/4GB mỗi).

Vì vậy, tôi đoán tôi cần phải tìm ra ai đang gọi VirtualAlloc và đặt trước tất cả bộ nhớ này. Làm thế nào để làm điều đó?

Việc đính kèm trình gỡ rối vào quá trình trước khi cấp phát bộ nhớ là khó khăn, vì w3wp.exe là một quá trình được khởi chạy bởi svchost.exe (có nghĩa là, bộ lọc IIS/ASP.Net) và nếu tôi cố gắng tự khởi chạy nó để gỡ lỗi nó nó chỉ đóng cửa mà không cần tất cả đặt phòng bộ nhớ dồi dào này. Ngoài ra, các tham số dòng lệnh không hợp lệ nếu tôi sử dụng lại chúng (điều này có ý nghĩa vì nó là một đường ống được tạo bởi quá trình gọi).

Tôi có thể đính kèm nó vào quá trình sau khi thực tế (đó là cách tôi tìm thấy vùng bộ nhớ được đề cập), nhưng tôi không chắc là có thể vào thời điểm đó để xác định ai đã phân bổ cái gì.

+1

Tôi chỉ muốn nói "Ôi Chúa ơi"! – StingyJack

+0

Đó là lần sử dụng đầu tiên có liên quan của thẻ mới mà tôi đã xem (tất cả các trang Heroes trên NBC.com)! –

+0

Tôi thấy cùng một hành vi trên Server 2008, IIS7 –

Trả lời

7

David Wang answers this to a similar question:

[...] hiệu suất develo ASP.Net per nói với tôi rằng:

  • Bộ nhớ ảo dành riêng là không có gì phải lo lắng. Bạn có thể xem nó làm điều kiện tiên quyết về hiệu suất/bộ nhớ đệm của CLR. Và thử nghiệm tải nặng cho thấy rằng không có gì phải lo lắng về.
  • System.Windows.Forms - Nó không được đưa vào bởi thế giới rỗng xin chào ASPX . Bạn có thể sử dụng Microsoft Debugging Công cụ và "sx e ld system.windows.forms" để xác định nội dung thực sự kéo nó vào lúc chạy. Hoặc bạn có thể sử dụng để tìm phụ thuộc .
  • mscorlib - đảm bảo rằng nó là GAC'd và NGen'd đúng cách.
3

Bộ nhớ ảo chỉ là không gian địa chỉ được cấp phát cho quy trình. Nó không liên quan gì đến việc sử dụng bộ nhớ.

Xem:

  1. Virtual Memory
  2. Pushing the Limits of Windows: Virtual Memory
  3. http://support.microsoft.com/kb/555223
+0

Số lượng bộ nhớ ảo được đặt trước tác động "Kích thước ảo" của quá trình, làm cho quá trình tái chế trong asp.net dựa trên giới hạn bộ nhớ ảo vô ích. –

+0

Và giả sử đó có ý nghĩa gì? VM có thể tăng lên do nhu cầu tăng địa chỉ. Tôi không chắc chắn nếu điều này sẽ bao giờ nhận được quá lớn. Tôi không thể thực sự kiểm tra, chỉ có 32 bit Vista ở đây. Bạn sẽ nhận được tối đa 3GB VM AFAIK, nhưng chỉ khoảng 2GB bộ nhớ thực tối đa cho mỗi quá trình. – leppie

0

reserved nhớ rất khác so với phân bổ bộ nhớ. Bộ nhớ dự trữ chỉ phân bổ không gian địa chỉ.Nó không cam kết bất kỳ trang vật lý nào.

Không gian địa chỉ này có khả năng được cấp phát bởi IIS cho vùng heap của nó. Nó sẽ chỉ cam kết các trang khi cần thiết.

Nếu bạn thực sự muốn khởi chạy w3wp.exe từ windbg, bạn có thể cần khởi chạy nó với các đối số dòng lệnh hợp lệ. Bạn có thể sử dụng Process Explorer để xác định dòng lệnh cho quá trình w3wp.exe hiện tại là gì. Ví dụ, trên máy chủ của tôi, tôi là:

c:. \ Windows \ system32 \ inetsrv \ w3wp.exe -a \ \ ống \ iisipmeca56ca2-3a28-452a-9ad3-9e3da7b7c765 -t 20 -ap " DefaultAppPool"

tôi không chắc chắn những gì UID trong đó quy định cụ thể, nhưng có vẻ nó có thể được tạo ra một cách nhanh chóng bởi dịch vụ W3SVC (đó là những gì đưa ra w3wp.exe) để đặt tên cho đường ống quy định đó. Vì vậy, bạn chắc chắn nên nhìn vào dòng lệnh của bạn trước khi tung ra w3wp từ windbg.

+0

Các đối số dòng lệnh này là một lần và không thể được sử dụng lại, tôi đã thử. –

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