Merge "storaged: track fsync calls"

This commit is contained in:
TreeHugger Robot 2017-03-03 20:12:20 +00:00 committed by Android (Google) Code Review
commit 6048d9db5f
3 changed files with 31 additions and 20 deletions

View file

@ -46,6 +46,7 @@ struct uid_io_stats {
uint64_t wchar; // characters written uint64_t wchar; // characters written
uint64_t read_bytes; // bytes read (from storage layer) uint64_t read_bytes; // bytes read (from storage layer)
uint64_t write_bytes; // bytes written (to storage layer) uint64_t write_bytes; // bytes written (to storage layer)
uint64_t fsync; // number of fsync syscalls
}; };
struct uid_info { struct uid_info {

View file

@ -20,12 +20,12 @@
#include <time.h> #include <time.h>
#include <string> #include <string>
#include <sstream>
#include <unordered_map> #include <unordered_map>
#include <android-base/file.h> #include <android-base/file.h>
#include <android-base/logging.h> #include <android-base/logging.h>
#include <android-base/macros.h> #include <android-base/macros.h>
#include <android-base/strings.h>
#include <android-base/stringprintf.h> #include <android-base/stringprintf.h>
#include <log/log_event_list.h> #include <log/log_event_list.h>
#include <packagelistparser/packagelistparser.h> #include <packagelistparser/packagelistparser.h>
@ -64,19 +64,33 @@ std::unordered_map<uint32_t, struct uid_info> uid_monitor::get_uid_io_stats_lock
return uid_io_stats; return uid_io_stats;
} }
std::stringstream ss(buffer); std::vector<std::string> io_stats = android::base::Split(buffer, "\n");
struct uid_info u; struct uid_info u;
bool refresh_uid = false; bool refresh_uid = false;
while (ss >> u.uid) { for (uint32_t i = 0; i < io_stats.size(); i++) {
ss >> u.io[FOREGROUND].rchar >> u.io[FOREGROUND].wchar if (io_stats[i].empty()) {
>> u.io[FOREGROUND].read_bytes >> u.io[FOREGROUND].write_bytes continue;
>> u.io[BACKGROUND].rchar >> u.io[BACKGROUND].wchar }
>> u.io[BACKGROUND].read_bytes >> u.io[BACKGROUND].write_bytes; std::vector<std::string> fields = android::base::Split(io_stats[i], " ");
if (fields.size() < 9) {
LOG_TO(SYSTEM, WARNING) << "Invalid io stats: \""
<< io_stats[i] << "\"";
continue;
}
u.uid = stoul(fields[0]);
u.io[FOREGROUND].rchar = stoull(fields[1]);
u.io[FOREGROUND].wchar = stoull(fields[2]);
u.io[FOREGROUND].read_bytes = stoull(fields[3]);
u.io[FOREGROUND].write_bytes = stoull(fields[4]);
u.io[BACKGROUND].rchar = stoull(fields[5]);
u.io[BACKGROUND].wchar = stoull(fields[6]);
u.io[BACKGROUND].read_bytes = stoull(fields[7]);
u.io[BACKGROUND].write_bytes = stoull(fields[8]);
if (!ss.good()) { if (fields.size() == 11) {
ss.clear(std::ios_base::badbit); u.io[FOREGROUND].fsync = stoull(fields[9]);
break; u.io[BACKGROUND].fsync = stoull(fields[10]);
} }
if (last_uid_io_stats.find(u.uid) == last_uid_io_stats.end()) { if (last_uid_io_stats.find(u.uid) == last_uid_io_stats.end()) {
@ -88,11 +102,6 @@ std::unordered_map<uint32_t, struct uid_info> uid_monitor::get_uid_io_stats_lock
uid_io_stats[u.uid] = u; uid_io_stats[u.uid] = u;
} }
if (!ss.eof() || ss.bad()) {
uid_io_stats.clear();
LOG_TO(SYSTEM, ERROR) << "read UID IO stats failed";
}
if (refresh_uid) { if (refresh_uid) {
packagelist_parse(packagelist_parse_cb, &uid_io_stats); packagelist_parse(packagelist_parse_cb, &uid_io_stats);
} }

View file

@ -281,14 +281,15 @@ void log_console_running_uids_info(std::vector<struct uid_info> uids) {
// Title // Title
printf("Per-UID I/O stats\n"); printf("Per-UID I/O stats\n");
printf(" Application FG Read FG Write FG Read FG Write BG Read BG Write BG Read BG Write\n" printf(" Application FG Read FG Write FG Read FG Write BG Read BG Write BG Read BG Write FG fsync BG fsync\n"
" NAME/UID Characters Characters Bytes Bytes Characters Characters Bytes Bytes\n" " NAME/UID Characters Characters Bytes Bytes Characters Characters Bytes Bytes \n"
" ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------\n"); " ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------\n");
for (const auto& uid : uids) { for (const auto& uid : uids) {
printf("%50s%15ju%15ju%15ju%15ju%15ju%15ju%15ju%15ju\n", uid.name.c_str(), printf("%50s%15ju%15ju%15ju%15ju%15ju%15ju%15ju%15ju%15ju%15ju\n", uid.name.c_str(),
uid.io[0].rchar, uid.io[0].wchar, uid.io[0].read_bytes, uid.io[0].write_bytes, uid.io[0].rchar, uid.io[0].wchar, uid.io[0].read_bytes, uid.io[0].write_bytes,
uid.io[1].rchar, uid.io[1].wchar, uid.io[1].read_bytes, uid.io[1].write_bytes); uid.io[1].rchar, uid.io[1].wchar, uid.io[1].read_bytes, uid.io[1].write_bytes,
uid.io[0].fsync, uid.io[1].fsync);
} }
fflush(stdout); fflush(stdout);
} }