2012-09-05 32 views
5

Tôi mới dùng PowerShell nhưng đã viết lên một vài tập lệnh chạy trên máy chủ windows2003. Nó chắc chắn mạnh mẽ hơn so với kịch bản lệnh cmd (có thể do tôi có nền tảng lập trình). Tuy nhiên, khi tôi nghiên cứu kỹ hơn, tôi nhận thấy rằng:Sử dụng bộ nhớ của Powershell - đắt tiền?

  1. Mỗi tập lệnh được khởi chạy sẽ chạy theo 1 quá trình quyền hạn, tức là. bạn sẽ thấy một quy trình quyền hạn mới cho mỗi tập lệnh.
  2. các tập lệnh tôi đã thử nghiệm cho bộ nhớ thực sự đơn giản, hãy xây dựng một chuỗi hoặc truy vấn biến môi trường, sau đó Bắt đầu-Ngủ trong 60 giây, Vì vậy, không cần thiết (như sử dụng bộ nhớ). Nhưng mỗi quá trình mất xung quanh> 30MB. Hãy gọi cho tôi là keo kiệt, nhưng vì có các ứng dụng chuyên sâu về bộ nhớ được lập lịch để chạy hàng ngày và nếu tôi cần lập lịch một số tập lệnh PowerShell để chạy thường xuyên và có thể một số tập lệnh chạy liên tục dưới dạng dịch vụ, tôi chắc chắn sẽ cố gắng giữ bộ nhớ mức tiêu thụ càng thấp càng tốt. < - Điều này là do chúng tôi gần đây gặp phải lỗi ứng dụng lớn do thiếu bộ nhớ.

Tôi chưa chạm vào C#, nhưng liệu có ai cho rằng đôi khi có thể viết tốt hơn trong C#?

Trong khi đó, tôi đã thấy các bài đăng liên quan đến rò rỉ bộ nhớ trong PowerShell. Tôi có quyền nghĩ rằng bộ nhớ được tạo ra bởi kịch bản sẽ được withing quá trình không gian của PowerShell, để khi kịch bản chấm dứt do đó powershell chấm dứt, bộ nhớ tạo ra được xóa?

+0

nó sẽ giúp PS rất kinh nghiệm nếu bạn chỉnh sửa câu hỏi của mình để bao gồm các trường hợp có thể sao chép, ví dụ: kịch bản mẫu, chi tiết về cách khởi chạy và cách bạn xác định mức sử dụng bộ nhớ. Chúc may mắn. – shellter

Trả lời

4

PowerShell.exe 2.0 của chính tôi (không chạy tập lệnh) là ~ 30MB trên XP. Điều này không nên lo lắng cho bạn nhiều với bộ nhớ trung bình cho mỗi máy trong những ngày này. Về rò rỉ bộ nhớ, đã có trường hợp mọi người sử dụng thư viện của bên thứ ba có rò rỉ bộ nhớ khi các đối tượng không được xử lý đúng cách. Để giải quyết những người bạn phải tự gọi thu gom rác sử dụng [gc]::Collect(), nhưng điều này là rất hiếm. Lần khác tôi đã thấy mọi người sử dụng Get-Content để đọc một tệp rất lớn và gán nó cho một biến trước khi sử dụng nó. Điều này sẽ mất rất nhiều bộ nhớ là tốt. Trong trường hợp đó, bạn có thể sử dụng đường ống để đọc các phần của tệp tại một thời điểm để giảm bớt dung lượng bộ nhớ của bạn.

+1

PowerShell hoạt động hiệu quả nhất khi bạn có thể truyền công việc tức là hoạt động trên một mục tại một thời điểm và không lưu trữ tất cả các mục trong một biến để sử dụng sau này (như được chỉ ra trong câu trả lời này). Ngay cả trong các kịch bản truyền trực tuyến, bạn phải xem một số lệnh ghép ngắn nhất định không thể phát trực tiếp như Sort-Object, Group-Object và Format-Table với tham số -AutoSize được chỉ định. –

+0

@KeithHill làm cho một điểm tốt, vì bản chất của chúng là loại lệnh mà Keith đề cập cần nhận tất cả dữ liệu từ đường dẫn trước khi chúng có thể xử lý, vì vậy mặc dù 'Get-Content' có thể xử lý các phần của tập tin tại một thời điểm và truyền phát thông qua đường dẫn, các lệnh ghép ngắn như 'Sort-Object' sẽ cần phải đệm tất cả dữ liệu đến có khả năng tạo ra lỗi bộ nhớ. –

5

1 - Có, quy trình mới được tạo. Điều này cũng đúng khi chạy một kịch bản lệnh cmd, vb script, hoặc C# được biên dịch thực thi.

2 - Tải máy chủ lưu trữ PowerShell và thời gian chạy sẽ mất một số lượng bộ nhớ không nhỏ, thay đổi từ hệ thống sang phiên bản hệ thống và phiên bản. Nó thường sẽ là một quá trình trọng lượng nặng hơn một vỏ cmd hoặc một C# exe chuyên dụng. Đối với những MB đó, bạn sẽ nhận được sự hỗ trợ thư viện và thời gian chạy phong phú giúp Powershell trở nên mạnh mẽ.

Nhận xét chung:

  • Hệ điều hành cấp phát bộ nhớ cho mỗi quá trình. Khi quá trình chấm dứt, tất cả bộ nhớ của nó sẽ được khôi phục. Đây là thiết kế chung của bất kỳ hệ điều hành hiện đại nào, và không dành riêng cho Powershell hoặc thậm chí là Windows.
  • Nếu nhóm của bạn đang chạy các ứng dụng kinh doanh quan trọng trên phần cứng sao cho một số ít các quy trình 30MB có thể gây ra sự cố thảm khốc, bạn có vấn đề lớn hơn. Việc mở trình duyệt và truy cập Facebook sẽ ăn nhiều bộ nhớ hơn thế.Trong thời gian bạn cần tìm ra giải pháp tập lệnh batch phức tạp, bạn có thể tạo giải pháp tốt hơn trong Powershell và công ty của bạn có thể trả tiền cho phần cứng chuyên dụng mới với số tiền tiết kiệm trong giờ có thể lập hóa đơn :-)
  • Bạn nên sử dụng công cụ thích hợp nhất cho công việc. Powershell là thường là công cụ phù hợp, nhưng không phải lúc nào cũng vậy. Thật tuyệt vời cho việc tự động hóa các tác vụ quản trị trong môi trường Windows (xử lý tệp, làm việc với AD, các tác vụ được lập biểu, thiết lập quyền, v.v.). Nó ít tuyệt vời hơn cho các tác vụ có hiệu suất cao, nhiều thuật toán hoặc để mã hóa phức tạp với các API nguyên gốc. Đối với những nhiệm vụ này, C# sẽ có ý nghĩa hơn.
  • Powershell có sự hỗ trợ/hỗ trợ rất lớn từ Microsoft (và một cộng đồng người dùng lớn!), Và nó được làm rất rõ ràng rằng đó là môi trường kịch bản ưa thích cho Windows trong tương lai. Tất cả công nghệ phía máy chủ mới cho Windows đều có hỗ trợ mạnh mẽ. Nếu bạn đang làm việc trong quản trị/CNTT, nó sẽ là một đầu tư khôn ngoan để xây dựng một số kỹ năng trong Powershell. Tôi sẽ không bao giờ ngăn cản ai đó học C#, nhưng nếu vai trò của bạn là CNTT nhiều hơn dev thì Powershell sẽ là công cụ thích hợp thường xuyên hơn nhiều, và các đồng nghiệp của bạn có nhiều khả năng cũng hiểu nó hơn.
+0

Con trỏ tuyệt vời! –

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