2013-03-25 31 views
5

Có ai biết cách truy cập bộ nhớ (con trỏ) gây ra lỗi trang không? Tôi quan tâm chủ yếu trong các lỗi trang chính.Truy cập bộ nhớ đăng nhập gây ra lỗi trang lớn

Một chút thông tin cơ bản về những gì tôi đang cố gắng đạt được. Tôi có một ứng dụng với một dấu chân bộ nhớ lớn (một cơ sở dữ liệu) và tôi muốn tương quan phân trang với các truy cập vào các cấu trúc dữ liệu lớn (chẳng hạn như các bảng, các chỉ mục được cấp phát bằng cách sử dụng mmap()). Ánh xạ của quá trình này rất dễ lấy từ/proc // maps. Bây giờ, nếu tôi có quyền truy cập bộ nhớ gây ra lỗi trang, tôi có thể theo dõi có bao nhiêu lỗi trang được gây ra khi truy cập mỗi cấu trúc dữ liệu.

Tôi nghĩ rằng perf hoặc systemtap có thể thực hiện công việc. Bất kỳ ý tưởng?

Trả lời

6

Xem những gì có sẵn tại các điểm thăm dò:

% stap -L vm.pagefault 
vm.pagefault name:string write_access:long address:long $mm:struct mm_struct* \ 
    $vma:struct vm_area_struct* $address:long unsigned int $flags:unsigned int 

Log, cố gắng để ánh xạ địa chỉ cho tên biểu tượng

# stap -e 'probe vm.pagefault { if (execname()=="foo") { printf("%p (%s)\n", address, usymdata(address)) } }' -d /bin/foo --ldd 

Xem thêm: http://sourceware.org/systemtap/examples/#memory/pfaults.stp

6

đoán của bạn là đúng. Bạn có thể sử dụng công cụ perf để theo dõi số lỗi trang mà ứng dụng của bạn đã gây ra.

Tôi khuyên bạn nên đọc this tutorial để tìm hiểu cách sử dụng công cụ.

Để cài đặt chỉ cần sử dụng:

Bạn đang tìm kiếm sự kiện trang lỗi. Bạn có thể cài đặt (trong ubuntu hoặc phân phối apt khác) bằng cách:

sudo apt-get install linux-tools-common linux-base 
sudo apt-get install linux-tools-YOUR-KERNEL number 

Bạn có thể lấy số lượng hạt nhân của bạn với: uname -r

Như một ví dụ, lệnh này chạy công cụ Perf vào "ls "lệnh:

perf record -e page-faults:u -F 250 ls 

và sau đó bạn có thể nhìn vào kết quả (nhị phân của 'ls' không có thông tin debug, vì vậy tôi không mong đợi một kết quả khá) với:

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