linux系统systemtap监控应用问题分析

应用场景:一天,在我们服务器上PHP代码路径下多了一个log文件,从没注意到有这个log文件,但是log文件的格式明显不是我们生成的,格式比较简单,甚至没有function name,log level,明显是我们使用的某个第三方库的输出。到底是那个进程调用第三方库干的坏事 ? 我们当然是有怀疑对象的,从log的语义也可以初步判断是那个进程干的这件事。可是没有证据。

有的童鞋就说了,对这个可疑进程直接执行lsof -p pid或者对文件执行 lsof file不就OK 了,如果这个进程打开了这个莫名其妙的文件,就证明的确是可疑进程写了这个log文件。可惜的是这个进程不是daemon,而且执行时间特别短,来不及对他进行lsof。

这有到了我们systemtap横空出世的时候了。 systemtap由于他的可定制,几乎是一把无所不能的瑞士军刀。第一思路就是监控sys_open,看下到底是那个进程在作死,打开了这个莫名其妙的文件。

方法一 : 监控sys_open

我们都知道systemtap可以监控系统调用,open作为一个系统调用,我们自然可以监控,如果open的文件恰好是我们要追踪的文件,我们就将pid ,execname 打印出来,真相大白。

 代码如下 复制代码
function is_open_creating:long (flag:long)
{
    CREAT_FLAG = 4 // 0x4 = 00000100b
    if (flag & CREAT_FLAG)
    {
            return 1
    }
    return 0
}
probe begin
{
    printf("monitor file beginn")
}
probe kernel.function("sys_open")
{
    if(user_string($filename)== "/home/manu/shell/temp/abc.log")
    {
        creating = is_open_creating($mode);
        if(creating)
        {
            printf("pid %ld (%s) create the file %sn",pid(),execname(),user_string($filename));
        }
        else
        {
            printf("pid %ld (%s) open the file %s n",pid(),execname(),user_string($filename));
        }
    }
}

OK ,我们开始监控,看看能否捕捉到捣乱者。

 代码如下 复制代码
root@manu:~/code/systemtap#
root@manu:~/code/systemtap# stap file_monitor.stp
monitor file begin

我们在另一个终端l中echo创建这个/home/manu/shell/temp/abc.log

 代码如下 复制代码
root@manu:~/code/shell/temp# echo abefdf >/home/manu/code/shell/temp/abc.log
root@manu:~/code/shell/temp#

我们看到stap捕捉到了这个事件:

 代码如下 复制代码
root@manu:~/code/systemtap# stap file_monitor.stp
monitor file begin
pid 3024 (bash) create the file /home/manu/code/shell/temp/abc.log

Stap捕捉到进程名为bash,PID为3024的进程create了这个文件。目前为止,一切都好,可惜这种方法有个致命的缺陷。filename是进程调用系统调用 open时 输入的文件名,可能输入全路径/home/manu/shell/temp/abc.log,也可能输入的是相对路径,如果输入的是相对路径,我们的stap不能捕捉到这个事件。

比如我们再次想abc.log追加写:

 代码如下 复制代码
root@manu:~/code/shell/temp# echo "second line " >> abc.log
root@manu:~/code/shell/temp# cat abc.log
abefdf
second line
root@manu:~/code/shell/temp#

另一端没有stap没有检测到任何事件。
这种方法有缺陷,因为我们不能够假设进程输入的绝对路径还是相对路径。

方法二 :监控文件的inode

文件的名字表示方法可能不同,比如当前路径是 /home/manu/shell/temp/ ,下面表示的都是同一个文件,这就给上面一种方法带来的困难。

 abc.log
 ./abc.log
 ../temp/abc.log
 /home/manu/shell/temp/abc.log
  .....
如果我们的文件在磁盘上,那么只要有(主设备号,次设备好,inode)这三个元素,就唯一确定了一个文件。我们还是监控刚才的abc.log。对于我的文件在/dev/sda6,对应的主设备号和次设备号是 (0x8,0x6),abc.log对应的inode为:

 代码如下 复制代码
361way:/opt # ll -ali abc.log
2099351 -rwxr-xr-x 1 root root 17623 Sep  2 22:55 abc.log

我们的三元组是(0x08,0x06,2099351)
下面是我们的监控脚本inode_monitor.stp

 代码如下 复制代码
probe begin
{
    printf("watch inode %d %d %ld beginn",$1,$2,$3)
}
probe vfs.write
{
   if (dev == MKDEV($1,$2) # major/minor device
            && ino == $3)
    printf ("%s(%d) %s 0x%x/%un",execname(), pid(), probefunc(), dev, ino)
}

然后我们让stap来监控这个inode对应的文件

 代码如下 复制代码
root@manu:~/code/systemtap# stap inode_monitor.stp 0x8 0x6 2099351
watch inode 8 6 2099351 begin

开始我们的实验,我们在shell终端上echo两句写入abc.log,在写一个test.sh脚本去写这个abc.log,实验如下

 代码如下 复制代码
root@manu:~/code/shell/temp# echo abefdf >abc.log
root@manu:~/code/shell/temp# echo "second line" > ./abc.log
root@manu:~/code/shell/temp# cat test.sh
#!/bin/sh
 echo "third line " >> ./abc.log
root@manu:~/code/shell/temp# ./test.sh

stap监控脚本的输出如下:

 代码如下 复制代码
root@manu:~/code/systemtap# stap inode_monitor.stp 0x8 0x6 2099351
watch inode 8 6 2099351 begin
bash(3024) vfs_write 0x800006/2099351
bash(3024) vfs_write 0x800006/2099351
test.sh(9484) vfs_write 0x800006/2099351

我们看到这三个事件都被捕捉到了。也就完成了我们监控这个文件,判断到底是那个进程写入这个log的目标。

systemtap作为一个动态监控和跟踪linux内核的工具,其功能还可以发掘更多。更多内容可以查看IBM社区或systemtap官方网站 。同时也可以了解DTrace、ProbeVue (这两者在unix平台上)及fanotify(下一代的inotify文件监控 )同类工具。

其他性能工具OProfile、Valgrind、Perf、 redhat MGR 等回头再总结学习

时间: 2024-09-13 03:24:38

linux系统systemtap监控应用问题分析的相关文章

Linux系统GoAccess Web实时日志分析和统计工具

前几天老左有在军哥和小夜的博客中看到有分享GoAccess这款比较强大的日志分析工具,从功能以及关系数据的用户体验上着实是一款不错的可以用于Linux VPS/服务器中用来对网站日志和用户数据进行分析和统计的工具.就好比很多大型的网站,我们很少有见到有使用网站统计工具的,一般都是通过日志分析用户和各种信息数据的. GoAccess,这款可以用于Linux系统的日志分析工具,可以用于Nginx.Apache等服务器日志处理中,也可以利用Cygwin使用到Windows系统中.一般而言,我们使用Li

Linux 系统实时监控的瑞士军刀 —— Glances

早些时候,我们提到过有很多可以用来监视系统性能的 Linux 系统监视工具. 但我们估计,或许更多的用户会倾向与绝大多数 Linux 发行版都带的工具 (top 命令). top 命令是 Linux 下的一个实时任务管理器, 同时也是用于在 GNU/Linux 发行版中寻找系统性能方面的瓶颈,并帮助我们作出正确操作的常用系统监视工具. 她有着一个极为简洁的界面,并自带少量的可以帮助我们快速了解系统性能的实用选项. 但是,有些时候想要通过她寻找一个占用系统资源比较大的应用或进程可能会比较困难. 因

linux系统中监控自动化脚本

问题汇总问题1.逐渐告警,问题出现时,第一时候通知XX人,多长时间没解决,通知XXX人 问题2.问题主机出现告警时,想要获取其他相关监控值的情况,如load.cpu等,同时也可能会需要获取到其他会受影响主机的情况. 解决方法问题1 很多开源的监控产品里都有escalations功能,如常见的zabbix .nagios (这个确实是没关注到过的知识点) zabbix根据问题持续的时间发送给不同的人 来处理的配置方法: 例如:  代码如下 复制代码 1 – 5 min  mail to user_

Linux系统中防火墙的框架分析_unix linux

Netfilter提供了一个抽象.通用化的框架,该框架定义的一个子功能的实现就是包过滤子系统.Netfilter框架包含以下五部分: 1. 为每种网络协议(IPv4.IPv6等)定义一套钩子函数(IPv4定义了5个钩子函数), 这些钩子函数在数据报流过协议栈的几个关键点被调用.在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用netfilter框架. 2. 内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给netfilter框架时,内核能检测是否有任何

linux系统中监控用户的操作记录命令

首先我们创建一个放操作记录的日志文件  代码如下 复制代码 touch /var/log/rootlog.txt 给这个文件相应的写权限和追加权限  代码如下 复制代码 chmod 002 /var/log/rootlog.txt chattr +a /var/log/rootlog.txt 编辑/etc/profile文件,末尾添加如下脚本命令  代码如下 复制代码 export HISTORY_FILE=/var/log/usermonitor/usermonitor.log export

linux系统centOS6.5使用goaccess工具分析nginx网站日志

网站的log日志分析是每个站长经常做的必备工作,通过网站日志文件我们可以分析各大搜索引擎对网站的爬取情况.最近我的网站做了一些调整,所以想看下日志文件,但因为网站服务器环境是LNMP,所以我就找了一款nginx日志文件分析工具--goaccess.本文我们将一起分享如何在linux(centos)中安装goaccess来分析网站日志. 准备工作: 系统:CentOS6.5(我在本地搭建的虚拟机) web服务:nginx 日志文件:access.log文件(从自己的环境中拷贝具体日志文件) 工具:

Shell脚本实现Linux系统和进程资源监控

 这篇文章主要介绍了Shell脚本实现Linux系统和进程资源监控,本文讲解了检查进程是否存在.检测进程 CPU 利用率.检测进程内存使用量.检测进程句柄使用量.,需要的朋友可以参考下     在服务器运维过程中,经常需要对服务器的各种资源进行监控,例如:CPU的负载监控,磁盘的使用率监控,进程数目监控等等,以在系统出现异常时及时报警,通知系统管理员.本文介绍在Linux系统下几种常见的监控需求及其shell脚本的编写. 文章目录: 1.Linux使用 Shell 检查进程是否存在 2.Linu

Shell脚本实现Linux系统和进程资源监控_基础知识

在服务器运维过程中,经常需要对服务器的各种资源进行监控,例如:CPU的负载监控,磁盘的使用率监控,进程数目监控等等,以在系统出现异常时及时报警,通知系统管理员.本文介绍在Linux系统下几种常见的监控需求及其shell脚本的编写. 文章目录: 1.Linux使用 Shell 检查进程是否存在 2.Linux使用 Shell检测进程 CPU 利用率 3.Linux使用 Shell检测进程内存使用量 4.Linux使用 Shell检测进程句柄使用量 5.Linux使用 Shell查看某个 TCP 或

Linux系统下使用XHProf和XHGui分析PHP运行性能_php技巧

什么是性能分析?性能分析是衡量应用程序在代码级别的相对性能.性能分析将捕捉的事件包括:CPU的使用,内存的使用,函数的调用时长和次数,以及调用图.性能分析的行为也会影响应用性能. 什么时候应该进行性能分析? 在考虑是否进行性能分析时,你首先要想:应用是否存在性能问题?如果有,你要进一步考虑:这个问题有多大? 如果你不这样做,将会陷入一个陷阱--过早优化,这可能会浪费你的时间. 为了评断应用是否存在性能问题,你应该确定性能目标.例如,100 个并发用户的响应时间小于 1s .然后,你需要进行基准测