5

上接 实用Linux命令(一)

AICODE.CC

查看Linux的版本(Red Hat/Cent OS)

在RedHat和Cent OS下,使用如下命令查看当前系统的版本。

$ cat /etc/centos-release 
CentOS release 6.3 (Final)

time命令: 统计程序执行时间

用于统计程序执行时间,这些事件包含程序从被调用到终止的时间,用户CPU时间,系统CPU时间。

$ time ls
bakup                PDO-1.0.3.tgz     rinetd.tar.gz     yaf-2.2.9.tgz
channel.xml          package2.xml      PDO_MYSQL-1.0.2      xhprof-0.9.4      zendopcache-7.0.3
go-pear.phar         package.xml       PDO_MYSQL-1.0.2.tgz  xhprof-0.9.4.tgz  zendopcache-7.0.3.tgz
PDO-1.0.3            rinetd            yaf-2.2.9

real    0m0.002s
user    0m0.000s
sys 0m0.001s

tee命令

tee命令用于将标准输入拷贝到标准输出。

$ echo "hello,world"|tee -a test.txt

上述命令将hello,world字符串输出到test.txt文件中,-a 默认情况下,tee命令会使用>覆盖输出到文件,使用-a属性,会使用>>追加方式

netstat命令

查看端口占用情况

# netstat -apn
  • -a(--all) 显示所有的socket信息(包括监听和未监听)
  • -p(--program) 显示每个socket所属于的进程名称和PID
  • -n(--numeric) 显示数字形式的地址而不是符号化的主机名、端口或者用户名

perf命令

perf命令是随Linux内核代码一同发布和维护的性能诊断工具,由内核社区负责维护和发展。Perf不仅可以用于应用程序性能统计分析,也可以应用于内核代码的的性能统计和分析。

在Cent OS系统上,如果没有该命令的话,可以使用yum进行安装。

# yum install perf

perf命令非常强大,详细介绍的话篇幅比较长,可以阅读这篇文章 Perf -- Linux下的系统性能调优工具

用法: perf [--version] [--help] COMMAND [ARGS]

 最常用的perf命令:
   annotate        读取perf.data (使用perf record创建)文件并且显示标注的代码
   archive         Create archive with object files with build-ids found in perf.data file
   bench           进行基准测试的框架工具集
   buildid-cache   Manage build-id cache.
   buildid-list    List the buildids in a perf.data file
   diff            Read perf.data files and display the differential profile
   evlist          List the event names in a perf.data file
   inject          Filter to augment the events stream with additional information
   kmem            Tool to trace/measure kernel memory(slab) properties
   kvm             Tool to trace/measure kvm guest os
   list            列出所有事件类型的符号
   lock            分析锁事件
   mem             分析对内存的访问
   record          运行一个命令并且记录它的分析结果到perf.data文件中
   report          读取perf.data文件并且显示分析结果
   sched           Tool to trace/measure scheduler properties (latencies)
   script          Read perf.data (created by perf record) and display trace output
   stat            运行一个命令并且收集性能计数统计信息
   test            运行可用性测试
   timechart       Tool to visualize total system behavior during a workload
   top             系统分析工具.
   trace           受strace启发创建的工具
   probe           定义一个新的动态跟踪点

 See 'perf help COMMAND' for more information on a specific command.
perf stat

perf stat通过概括精简的方式提供被调试程序运行的整体情况和汇总数据。

创建如下C程序test.c

#include <stdio.h>

int main()
{
    int i = 1;
    while (1) {
        if (i == 100000) break;
        i ++;
    }
    return 0;
}

编译gcc test.c -o test

$ perf stat ./test

 Performance counter stats for './test':

          0.837322 task-clock                #    0.747 CPUs utilized          
                 1 context-switches          #    0.001 M/sec                  
                 0 CPU-migrations            #    0.000 M/sec                  
                98 page-faults               #    0.117 M/sec                  
           269,259 cycles                    #    0.322 GHz                     [90.39%]
           897,270 stalled-cycles-frontend   #  333.24% frontend cycles idle   
           226,746 stalled-cycles-backend    #   84.21% backend  cycles idle   
           764,602 instructions              #    2.84  insns per cycle        
                                             #    1.17  stalled cycles per insn
           267,843 branches                  #  319.881 M/sec                  
             3,467 branch-misses             #    1.29% of all branches         [80.37%]

       0.001121130 seconds time elapsed

第一个task-clock是CPU利用率,该值比较高,说明该程序属于CPU密集型。第二个context-switches是进程上下文切换次数,频繁的切换次数应该是要避免的。

perf top

用于实时显示当前系统的性能统计信息。该命令主要用来观察整个系统当前的状态,比如可以通过查看该命令的输出来查看当前系统最耗时的内核函数或某个用户进程。

执行该命令需要root权限。

使用方法如下

$ sudo perf top

程序会与top命令类似,动态输出以下内容

Samples: 1K of event 'cpu-clock', Event count (approx.): 8071695
 39.60%  [kernel]             [k] __do_softirq
 13.46%  [kernel]             [k] _raw_spin_unlock_irqrestore
  9.37%  [kernel]             [k] VbglGRPerform
  8.47%  [kernel]             [k] e1000_xmit_frame
  6.01%  [kernel]             [k] finish_task_switch
  5.82%  [kernel]             [k] e1000_clean
  5.15%  [kernel]             [k] native_read_tsc
  4.75%  [kernel]             [k] kmem_cache_free
  1.32%  [kernel]             [k] tick_nohz_idle_enter
  1.28%  libc-2.17.so         [.] __strstr_sse2
  1.22%  libc-2.17.so         [.] __memset_sse2
  0.82%  libc-2.17.so         [.] __GI___strcmp_ssse3
  0.42%  libpython2.7.so.1.0  [.] 0x000000000007e7c6
  0.42%  libc-2.17.so         [.] __strchrnul
  0.39%  [kernel]             [k] e1000_alloc_rx_buffers
  0.38%  libz.so.1.2.7        [.] 0x0000000000002d76
  0.24%  [kernel]             [k] tick_nohz_idle_exit
  0.21%  [kernel]             [k] kfree
perf report/record

使用 top 和 stat 之后,您可能已经大致有数了。要进一步分析,便需要一些粒度更细的信息。比如说您已经断定目标程序计算量较大,也许是因为有些代码写的不够精简。那么面对长长的代码文件,究竟哪几行代码需要进一步修改呢?这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果。

创建新的C程序test3,代码如下

#include <stdio.h>

void test();

int main()
{
  test();
  return 0;
}

void test()
{
  long i;
  for (i = 0; i < 10000000; i ++) {

  }
  puts("finished");
}

编译后,执行如下命令

$ perf record ./test3
$ perf report

输出以下内容

Samples: 68  of event 'cpu-clock', Event count (approx.): 17000000
 97.06%  test3  test3              [.] test
  1.47%  test3  [kernel.kallsyms]  [k] __do_softirq
  1.47%  test3  [kernel.kallsyms]  [k] queue_work_on

从中可以看到,大部分时间都消耗在了test函数中。

perf record命令增加-g参数可以记录函数的调用图信息。更多详情参考: Perf -- Linux下的系统性能调优工具

lsof命令: 列出打开的文件

工具lsof是一个可以列出操作系统打开的文件的工具,在Linux系统中,任何事物都是以文件的形式存在,通过文件不仅可以访问常规文件,还可以访问网络连接和硬件设备。

在终端下直接输入lsof命令,会列出当前系统打开的所有文件,因为它需要列出核心内存和各种文件,所以必须使用root用户运行才能显示详细的信息。

COMMAND     PID      USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
init          1      root  cwd       DIR              253,0      4096          2 /
init          1      root  rtd       DIR              253,0      4096          2 /
init          1      root  txt       REG              253,0    150352      10973 /sbin/init
init          1      root  mem       REG              253,0     65928     264638 /lib64/libnss_files-2.12.so
init          1      root  mem       REG              253,0   1922112     265339 /lib64/libc-2.12.so
init          1      root  mem       REG              253,0     93224     277540 /lib64/libgcc_s-4.4.6-20120305.so.1
init          1      root  mem       REG              253,0     47064     267086 /lib64/librt-2.12.so
...

这里的COMMAND是进程名称,PID,USER分别指的是进程的ID和进程所有者,FD是文件描述符,TYPE是文件类型,DEVICE是磁盘名称,SIZE是文件大小,NODE是索引节点(文件在磁盘上的标识),NAME是打开文件的确切名称。

对于FD的值,cwd表示当前工作目录,Lnn表示类库引用,mem表示内存映射文件,rtd表示根目录,pd表示父目录,txt表示进程的数据和代码。

常用参数及说明
  • lsof filename 显示打开指定文件的所有进程
  • lsof -a 表示两个参数都必须满足时才显示结果
  • lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
  • lsof -u username 显示所属user进程打开的文件
  • lsof -g gid 显示归属gid的进程情况
  • lsof +d /DIR/ 显示目录下被进程打开的文件
  • lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
  • lsof -d FD 显示指定文件描述符的进程
  • lsof -n 不将IP转换为hostname,缺省是不加上-n参数
  • lsof -i 用以显示符合条件的进程情况
  • lsof -p PID 选择指定PID
  • lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
    46: IPv4 or IPv6
    protocol: TCP or UDP
    hostname: Internet host name
    hostaddr: IPv4地址
    service: /etc/service中的 service name (可以不只一个)
    port: 端口号 (可以不只一个)

参考: 百度文库


mylxsw
7.8k 声望1.8k 粉丝

半栈开发者,开源项目 AIdea 作者