2009-09-16 46 views
7

Tôi đang viết một ứng dụng Linux để quan sát các ứng dụng khác và theo dõi việc tiêu thụ tài nguyên. Tôi đang lập kế hoạch làm việc với Java, nhưng ngôn ngữ lập trình không quan trọng đối với tôi. Mục tiêu là quan trọng, vì vậy tôi có thể chuyển sang công nghệ khác hoặc sử dụng các mô-đun. Ứng dụng của tôi chạy bất kỳ ứng dụng bên thứ ba nào được chọn làm quy trình con. Phần lớn phần mềm con giải quyết một số thuật toán như đồ thị, tìm kiếm chuỗi, vv. Chương trình Observer theo dõi tài nguyên của trẻ trong khi nó kết thúc công việc.Theo dõi bộ nhớ chủ đề và mức tiêu thụ CPU

Nếu ứng dụng con là đa luồng, có thể bằng cách nào đó có thể theo dõi lượng tài nguyên tiêu thụ mỗi luồng? Ứng dụng có thể được viết bằng cách sử dụng bất kỳ công nghệ chủ đề bộ nhớ không phân phối: chủ đề Java, chủ đề Boost, chủ đề POSIX, OpenMP, bất kỳ khác.

+1

Bạn đã xem OProfile để lấy cảm hứng? http://oprofile.sourceforge.net –

+0

Không, đây là bằng thạc sĩ của tôi. Có lẽ giảng viên của tôi nhìn :-) Nhưng OProfile trông thú vị. Cám ơn. – Pawka

Trả lời

5

Trong các hệ thống Linux hiện đại (2.6), mỗi luồng có một số nhận dạng riêng biệt có cùng cách xử lý giống như pid. Nó được hiển thị trong bảng quá trình (ít nhất, trong chương trình htop) và nó cũng có mục nhập /proc riêng biệt, tức là /proc/<tid>/stat.

Kiểm tra man 5 proc và đặc biệt chú ý đến stat, statm, status v.v. Bạn nên tìm thông tin bạn quan tâm ở đó.

Một trở ngại duy nhất là nhận số này chủ đề số nhận dạng. Nó khác với id quá trình! I E. getpid() cuộc gọi trong tất cả các chuỗi trả lại cùng một giá trị. Để có được nhận dạng chủ đề thực tế, bạn nên sử dụng (trong vòng một chương trình C):

pid_t tid = syscall(SYS_gettid); 

Bằng cách này, máy ảo java (ít nhất, thực hiện OpenJDK Linux của nó) nào đó trong nội bộ và sử dụng nó cho mục đích gỡ lỗi trong back-end của nó, nhưng không đưa nó vào giao diện java.

4

Bộ nhớ không được cấp phát cho chuỗi và thường được chia sẻ qua các chuỗi. Điều này làm cho nó nói chung là không thể và ít nhất là vô nghĩa để nói về mức tiêu thụ bộ nhớ của một sợi.

Ví dụ có thể là một chương trình có 11 chủ đề; 1 tạo đối tượng và 10 đối tượng bằng cách sử dụng các đối tượng đó. Hầu hết công việc được thực hiện trên 10 luồng đó, nhưng tất cả bộ nhớ được cấp phát trên một luồng đã tạo ra các đối tượng. Bây giờ làm thế nào để một tài khoản cho điều đó?

+0

Tôi không thể nói rằng bạn không đúng.Nhưng chúng ta có thể giả định rằng việc sử dụng bộ nhớ một luồng là số lượng bộ nhớ mà thread cụ thể làm việc tại thời điểm hiện tại. Chủ yếu là chủ đề khóa bộ nhớ với semophores hoặc mutexes trong khi làm việc với dữ liệu. – Pawka

+0

Xin lỗi, nhưng điều đó vẫn không có ý nghĩa. Bộ nhớ chỉ đọc không cần khóa. Khi một mutex được sử dụng, không có cách nào hợp lý để xác định bộ nhớ nó bảo vệ mà không cần đi đến mã. – MSalters

+0

Tôi không nói về bộ nhớ chỉ đọc. Chúng tôi vẫn có thể đếm mức tiêu thụ bộ nhớ của chủ đề. Ví dụ làm việc với một số đồ thị, tạo ra các nút cho một số đếm vv Mỗi dữ liệu này có thể được truy cập bởi một sợi, được tạo ra bởi chính nó và làm sạch sau khi công việc được thực hiện. – Pawka

1

Nếu bạn sẵn sàng để sử dụng Perl hãy xem này: Sys-Statistics-Linux

tôi sử dụng nó cùng với một số gói đồ họa GD để tạo các biểu đồ sử dụng tài nguyên hệ thống cho các quá trình khác nhau.

Một điều cần lưu ý - bạn thực sự cần phải đọc/thu thập và hiểu các câu trả lời - lần cuối tôi thấy chúng không được ghi lại chính xác trong các trang của người đàn ông, bạn sẽ cần đọc nguồn kernel :

http://lxr.linux.no/#linux+v2.6.18/include/linux/jiffies.h

Ngoài ra, hãy nhớ rằng trong Linux là sự khác biệt duy nhất giữa một sợi và quá trình là bài chia sẻ bộ nhớ - khác hơn rằng họ đang giống hệt nhau trong cách hạt nhân thực hiện chúng.

+0

Liên kết Sys-Statistics-Linux bị hỏng .. –

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