测量进程在IO上花费的总时间

时间:2016-05-12 08:49:04

标签: linux performance io

在运行时命令时,其中一个程序提供以下输出:

public DataTable selectDates(string dateFrom,string dateTo)
{
    initilize();
    _conn.ConnectionString = _cs;
    _cmd.Connection = _conn;

    _cmd.CommandText = "Select Sum(tPrice) AS Price from [tblInventory] where Date_Of_Installation BETWEEN '" + dateFrom + "' AND '" + dateTo + "'";
    _da.SelectCommand = _cmd;
    _da.Fill(_dt);
    return _dt;
}

这里真实和用户+系统时间有很大的不同。这很可能是由于IO等待/调用所花费的时间。我想测量IO等待或IO调用中程序的总花费时间。有没有办法做到这一点?

我尝试过使用iotop。但是,它不会报告执行IO的程序所花费的总时间。

1 个答案:

答案 0 :(得分:2)

是的,strace

示例1

我想测量访问stackoverflow.com时在I / O上花费的时间:

$ time  curl stackoverflow.com >/dev/null 2>&1
curl stackoverflow.com > /dev/null 2>&1  0.00s user 0.01s system 2% cpu 0.392 total

好的,系统中2%CPU和0.01秒。让我们来看看:

$ strace -c curl stackoverflow.com >/dev/null 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  240k    0  240k    0     0   127k      0 --:--:--  0:00:01 --:--:--  130k
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 54.12    0.005497          11       506           write
 18.16    0.001845          43        43           fstat
 11.95    0.001214          30        41           poll
  5.75    0.000584          32        18           recvfrom
  3.40    0.000345           3       101           mmap
  2.51    0.000255           4        62           mprotect
  1.98    0.000201           4        50           close
  1.84    0.000187          31         6           getsockname
  0.29    0.000029           1        42         1 open

特别有用的是将此结果与没有args的curl运行测量结果进行比较。

反正。 strace表明curl主要花费在write,fstat和poll上的时间。

另一个例子

第一种方法似乎显示睡眠不正确的结果。如果您对第一种方法不满意,可以只打印每个系统调用的获取时间(strace -T)。获取此数据并处理它们以查找每个系统调用的摘要时间。

$ strace 2>&1 -T curl stackoverflow.com >/dev/null | head -n 20

execve("/usr/bin/curl", ["curl", "stackoverflow.com"], [/* 62 vars */]) = 0 <0.000219>
brk(0)                                  = 0x186e000 <0.000175>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc04c9e6000 <0.000166>
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory) <0.000238>
open("/etc/ld.so.cache", O_RDONLY)      = 3 <0.000144>
fstat(3, {st_mode=S_IFREG|0644, st_size=96498, ...}) = 0 <0.000175>
mmap(NULL, 96498, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc04c9ce000 <0.000164>
close(3)                                = 0 <0.000160>
open("/usr/lib64/libcurl.so.4", O_RDONLY) = 3 <0.000047>
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\333\300\">\0\0\0"..., 832) = 832 <0.000160>
fstat(3, {st_mode=S_IFREG|0755, st_size=346008, ...}) = 0 <0.000216>
mmap(0x3e22c00000, 2438600, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3e22c00000 <0.000189>
mprotect(0x3e22c51000, 2097152, PROT_NONE) = 0 <0.000032>
mmap(0x3e22e51000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x51000) = 0x3e22e51000 <0.000119>
close(3)                                = 0 <0.000110>
open("/lib64/libidn.so.11", O_RDONLY)   = 3 <0.000257>
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0/@U1\0\0\0"..., 832) = 832 <0.000051>
fstat(3, {st_mode=S_IFREG|0755, st_size=209088, ...}) = 0 <0.000041>
mmap(0x3155400000, 2301736, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3155400000 <0.000037>
mprotect(0x3155432000, 2093056, PROT_NONE) = 0 <0.000037>