You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2015/04/02 21:05:23 UTC
[3/3] mesos git commit: Used the argv version of subprocess for linux
perf utilities.
Used the argv version of subprocess for linux perf utilities.
Review: https://reviews.apache.org/r/32698
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/88db77f2
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/88db77f2
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/88db77f2
Branch: refs/heads/master
Commit: 88db77f266b9f46a14b893effeb0bad1581b0022
Parents: 86d45bc
Author: Jie Yu <yu...@gmail.com>
Authored: Tue Mar 31 12:57:42 2015 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Apr 2 12:03:14 2015 -0700
----------------------------------------------------------------------
src/linux/perf.cpp | 81 +++++++++++++++++++++++++++++++++----------------
1 file changed, 55 insertions(+), 26 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/88db77f2/src/linux/perf.cpp
----------------------------------------------------------------------
diff --git a/src/linux/perf.cpp b/src/linux/perf.cpp
index 377b6d2..cad6c80 100644
--- a/src/linux/perf.cpp
+++ b/src/linux/perf.cpp
@@ -50,29 +50,45 @@ const string PIDS_KEY = "";
namespace internal {
-string command(
+vector<string> argv(
const set<string>& events,
const set<string>& cgroups,
const Duration& duration)
{
- ostringstream command;
+ vector<string> argv = {
+ "perf", "stat",
+
+ // System-wide collection from all CPUs.
+ "--all-cpus",
+
+ // Print counts using a CSV-style output to make it easy to import
+ // directly into spreadsheets. Columns are separated by the string
+ // specified in PERF_DELIMITER.
+ "--field-separator", PERF_DELIMITER,
+
+ // Ensure all output goes to stdout.
+ "--log-fd", "1"
+ };
- command << "perf stat -x" << PERF_DELIMITER << " -a";
- command << " --log-fd 1"; // Ensure all output goes to stdout.
// Nested loop to produce all pairings of event and cgroup.
foreach (const string& event, events) {
foreach (const string& cgroup, cgroups) {
- command << " --event " << event
- << " --cgroup " << cgroup;
+ argv.push_back("--event");
+ argv.push_back(event);
+ argv.push_back("--cgroup");
+ argv.push_back(cgroup);
}
}
- command << " -- sleep " << stringify(duration.secs());
- return command.str();
+ argv.push_back("--");
+ argv.push_back("sleep");
+ argv.push_back(stringify(duration.secs()));
+
+ return argv;
}
-string command(
+vector<string> argv(
const set<string>& events,
const string& cgroup,
const Duration& duration)
@@ -80,24 +96,36 @@ string command(
set<string> cgroups;
cgroups.insert(cgroup);
- return command(events, cgroups, duration);
+ return argv(events, cgroups, duration);
}
-string command(
+vector<string> argv(
const set<string>& events,
const set<pid_t>& pids,
const Duration& duration)
{
- ostringstream command;
+ vector<string> argv = {
+ "perf", "stat",
+
+ // System-wide collection from all CPUs.
+ "--all-cpus",
+
+ // Print counts using a CSV-style output to make it easy to import
+ // directly into spreadsheets. Columns are separated by the string
+ // specified in PERF_DELIMITER.
+ "--field-separator", PERF_DELIMITER,
+
+ // Ensure all output goes to stdout.
+ "--log-fd", "1",
- command << "perf stat -x" << PERF_DELIMITER << " -a";
- command << " --log-fd 1"; // Ensure all output goes to stdout.
- command << " --event " << strings::join(",", events);
- command << " --pid " << strings::join(",", pids);
- command << " -- sleep " << stringify(duration.secs());
+ "--event", strings::join(",", events),
+ "--pid", strings::join(",", pids),
+ "--",
+ "sleep", stringify(duration.secs())
+ };
- return command.str();
+ return argv;
}
@@ -113,8 +141,8 @@ inline string normalize(const string& s)
class PerfSampler : public Process<PerfSampler>
{
public:
- PerfSampler(const string& _command, const Duration& _duration)
- : command(_command), duration(_duration) {}
+ PerfSampler(const vector<string>& _argv, const Duration& _duration)
+ : argv(_argv), duration(_duration) {}
virtual ~PerfSampler() {}
@@ -158,7 +186,8 @@ private:
void sample()
{
Try<Subprocess> _perf = subprocess(
- command,
+ "perf",
+ argv,
Subprocess::PIPE(),
Subprocess::PIPE(),
Subprocess::PIPE());
@@ -233,7 +262,7 @@ private:
return;
}
- const string command;
+ const vector<string> argv;
const Duration duration;
Time start;
Option<Subprocess> perf;
@@ -273,8 +302,8 @@ Future<mesos::PerfStatistics> sample(
return Failure("Perf is not supported");
}
- const string command = internal::command(events, pids, duration);
- internal::PerfSampler* sampler = new internal::PerfSampler(command, duration);
+ const vector<string> argv = internal::argv(events, pids, duration);
+ internal::PerfSampler* sampler = new internal::PerfSampler(argv, duration);
Future<hashmap<string, mesos::PerfStatistics>> future = sampler->future();
spawn(sampler, true);
return future
@@ -303,8 +332,8 @@ Future<hashmap<string, mesos::PerfStatistics>> sample(
return Failure("Perf is not supported");
}
- const string command = internal::command(events, cgroups, duration);
- internal::PerfSampler* sampler = new internal::PerfSampler(command, duration);
+ const vector<string> argv = internal::argv(events, cgroups, duration);
+ internal::PerfSampler* sampler = new internal::PerfSampler(argv, duration);
Future<hashmap<string, mesos::PerfStatistics>> future = sampler->future();
spawn(sampler, true);
return future;