zoukankan      html  css  js  c++  java
  • linux strace

    yum install -y strace

    若某一进程占用cpu高可以用strace -p pid进行跟踪查看 

    strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。下面智游推送就为大家介绍linux运维中的strace命令

    strace使用参数

    -p 跟踪指定的进程
    -f 跟踪由fork子进程系统调用
    -F 尝试跟踪vfork子进程系统调吸入,与-f同时出现时, vfork不被跟踪
    -o filename 默认strace将结果输出到stdout。通过-o可以将输出写入到filename文件中
    -ff 常与-o选项一起使用,不同进程(子进程)产生的系统调用输出到filename.PID文件
    -r 打印每一个系统调用的相对时间
    -t 在输出中的每一行前加上时间信息。 -tt 时间确定到微秒级。还可以使用-ttt打印相对时间
    -v 输出所有系统调用。默认情况下,一些频繁调用的系统调用不会输出
    -s 指定每一行输出字符串的长度,默认是32。文件名一直全部输出
    -c 统计每种系统调用所执行的时间,调用次数,出错次数。
    -e expr 输出过滤器,通过表达式,可以过滤出掉你不想要输出

    基本上完整的用法是这样:
    strace -o /tmp/output2.txt -T -tt -e trace=desc -s 12 -p 17129
    (墙内:http://mikixiyou.iteye.com/blog/1489090)
    使用到的参数如下:
    1)strace -p pid  可以跟踪某个后台进程
    2)strace -o filename 把跟踪结果输出到文件
    3)strace -T 记录每个系统调用花费的时间,可以看看哪个系统调用时间长
    4)strace -t (或者 -tt)记录每个系统调用发生是的时间(时分秒的格式)
    5)strace -s 1024 显示系统调用参数时,对于字符串显示的长度, 默认是32,如果字符串参数很长,很多信息显示不出来。
    6)strace -e trace=nanosleep 只记录相关的系统调用信息。
        -e trace=network // 只记录和网络api相关的系统调用
        -e trace=file // 只记录涉及到文件名的系统调用
        -e trace=desc // 只记录涉及到文件句柄的系统调用
        还有其他的包括process,ipc,signal等。
     
     

    应用场景

    MySQL执行语句列表

    当发生个http请求的时候,很多时候希望得到这个http请求发生了多少次数据库SELECT操作,是否在同一个mysql connection连接里面完成。这里以访问本页为例子,通过strace来跟踪这些MySQL SELECT查询语句。

    //-9514是mysqld的进程号,为了看到整条SQL语句,我们通过-s 1024希望输出更多内容

    #strace -f -F -ff -o strace-mysqld -s 1024 -p 9514

    #find . -name "strace-mysqld*" -type f -print |xargs grep -n "SELECT.*FROM wp_"

    ./strace-mysqld.19203:64:

    read(19, "3SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'", 72) = 72

    ./strace-mysqld.19203:165:

    read(19, "3SELECT * FROM wp_users WHERE user_login = 'admin'", 50) = 50

    ./strace-mysqld.19203:184:

    read(19, "3SELECT meta_key, meta_value FROM wp_usermeta WHERE user_id = 1", 63) = 63

    ./strace-mysqld.19203:295:

    read(19, "3SELECT option_value FROM wp_options WHERE option_name = 'rewrite_rules' LIMIT 1", 80) = 80

    ./strace-mysqld.19203:311:

    read(19, "3 SELECT   wp_posts.* FROM wp_posts  WHERE 1=1  AND wp_posts.ID = 501

         AND wp_posts.post_type = 'post'  ORDER BY wp_posts.post_date DESC ", 136) = 136

    在调试的时候,strace能帮助你追踪到一个程序所执行的系统调用。当你想知道程序和操作系统如何交互的时候,这是极其方便的,比如你想知道执行了哪些系统调用,并且以何种顺序执行。

    这个简单而又强大的工具几乎在所有的Linux操作系统上可用,并且可被用来调试大量的程序

  • 相关阅读:
    浓缩版java8新特性
    restful的认识和用法
    常用业务返回对象类ResponseJson
    微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
    完整且易读的最新版小程序登录态和检验注册过没的app.js写法
    完整且易读的微信小程序的注册页面(包含倒计时验证码、获取用户信息)
    BCD工具类(8421)
    IDEA下使用protobuf2(java)
    chrome 调试技巧
    encodeURI和encodeURIComponent的区别?
  • 原文地址:https://www.cnblogs.com/howhy/p/6138556.html
Copyright © 2011-2022 走看看