0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

查看Linux文件占用进程写数据

dyquk4xk2p3d 来源:良许Linux 作者:良许Linux 2022-11-04 16:46 次阅读

	

背景

centos7 在某一段时间监控报警磁盘使用率达99%,由于监控属于概要形式信息,没有快照信息的监控(能发现某进程的I/O,CPU消耗情况),所以需要在服务器上去定时执行统计命令获取快照信息。 需要通过iostat -dx -k去查看avgqu-sz、await、svctm、%util; sar -u查看%iowait、%user; pidstat -d 查看进程I/O读写的快照信息

步骤

  • 生成统计信息文件

cat>/tmp/at_task.sh</tmp/pidstat_`date +%F_%T`.log 2>& 1 &
sar -u 2  >/tmp/sar_`date +%F_%T`.log 2>& 1 &
while [ 1 ];do echo -n `date +%T` >>/tmp/iostat_`date +%F` 2>& 1  && iostat -dx -k 1 1 >>/tmp/iostat_`date +%F` 2>& 1; sleep 2; done &
EOF

在while循环中使用iostat的原因是要输出date +%T时间,不然只有数据,没有时间信息也没有什么用

  • 使用at 命令定时执行

at 15:14 today -f /tmp/at_task.sh

出现错误

Can't open /var/run/atd.pid to signal atd. No atd running?

重启atd服务

service atd restart

重新开启at定时任务

at 15:14 today -f /tmp/at_task.sh
job 2 at Wed Mar 13 1500 2019

得到如下快照信息
iostat

1535Linux 3.10.0-862.14.4.el7.x86_64 (ip-xxxxx)     03/13/2019      _x86_64_        (4 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.12     0.07   17.31   19.41   580.79    90.52    36.57     0.09    2.39    4.42    0.57   0.72   2.63
scd0              0.00     0.00    0.00    0.00     0.00     0.00     6.00     0.00    0.28    0.28    0.00   0.25   0.00

sar

0300 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
0302 PM     all      0.25      0.00      0.38      0.00      0.00     99.37
0304 PM     all      1.25      0.13      0.63      0.00      0.00     97.99
0306 PM     all      0.25      0.13      0.50      0.00      0.00     99.12
0308 PM     all      0.50      0.00      0.50      0.63      0.00     98.37

pidstat

0300 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
0302 PM  5700      9089      0.00      6.00      0.00  uxxx
0302 PM  5700      9140      0.00      6.00      0.00  uxxx
0302 PM  5700      9292      0.00     10.00      0.00  uxxx
0302 PM     0     18084      0.00      2.00      0.00  bash

kill 掉收集信息的命令

ps -ef | egrep 'iostat|sar|pidstat|while' | grep -v grep | awk '{print $2}' | xargs -l kill

但ps -ef | egrep 命令没有获取到while循环的pid,不kill掉该while循环,就会一直对/tmp/iostat_2019-03-13写数据-_-

通过lsof 没有定位到打开文件的进程

lsof /tmp/iostat_2019-03-13 
[root@ip-10-186-60-117 ~]#
[root@ip-10-186-60-117 ~]#

通过lsof 可以定位到打开mysql-error.log的进程

lsof /opt/mysql/data/5690/mysql-error.log 
COMMAND   PID                USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
mysqld  12858 actiontech-universe    1w   REG  253,1     6345 20083533 /opt/mysql/data/5690/mysql-error.log
mysqld  12858 actiontech-universe    2w   REG  253,1     6345 20083533 /opt/mysql/data/5690/mysql-error.log

可见,某进程只有一只持有某文件的inode,才可以通过lsof查看文件在被那些进程使用

获取写文件的进程号

安装sysemtap

yum -y install systemtap

SystemTap 是对 Linux 内核监控和跟踪的工具
利用systemtap中的inodewatch.stp工具来查找写文件的进程号

得到文件的inode

stat -c '%i' /tmp/iostat_2019-03-13 
4210339

获取文件所在设备的major,minor

ls -al /dev/vda1
brw-rw---- 1 root disk 253, 1 Jan 30 13:57 /dev/vda1

得到写文件的pid

stap /usr/share/systemtap/examples/io/inodewatch.stp 253 1  4210339

Checking "/lib/modules/3.10.0-862.14.4.el7.x86_64/build/.config" failed with error: No such file or directory
Incorrect version or missing kernel-devel package, use: yum install kernel-devel-3.10.0-862.14.4.el7.x86_64

根据系统内核版本在kernel-devel rpm build for :ScientificLinux7网站上下载相应的kernal-devel包

wget ftp://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/7.2/x86_64/updates/security/kernel-devel-3.10.0-862.14.4.el7.x86_64.rpm

rpm -ivh kernel-devel-3.10.0-862.14.4.el7.x86_64.rpm

再次执行stap

stap /usr/share/systemtap/examples/io/inodewatch.stp 253 1 4210339
......
Missing separate debuginfos, use: debuginfo-install kernel-3.10.0-862.14.4.el7.x86_64
Pass 2: analysis failed. [man error::pass2]
Number of similar error messages suppressed: 2.

安装debuginfo kernal

debuginfo-install kernel-3.10.0-862.14.4.el7.x86_64
  Verifying  : kernel-debuginfo-common-x86_64-3.10.0-862.14.4.el7.x86_64                        1/3 
  Verifying  : yum-plugin-auto-update-debug-info-1.1.31-50.el7.noarch                           2/3 
  Verifying  : kernel-debuginfo-3.10.0-862.14.4.el7.x86_64                                      3/3 

Installed:
  kernel-debuginfo.x86_64 0:3.10.0-862.14.4.el7
  yum-plugin-auto-update-debug-info.noarch 0:1.1.31-50.el7

Dependency Installed:
  kernel-debuginfo-common-x86_64.x86_64 0:3.10.0-862.14.4.el7

再次执行stap

stap /usr/share/systemtap/examples/io/inodewatch.stp 253 1  4210339
ERROR: module version mismatch (#1 SMP Tue Sep 25 1452 CDT 2018 vs #1 SMP Wed Sep 26 1511 UTC 2018), release 3.10.0-862.14.4.el7.x86_64
WARNING: /usr/bin/staprun exited with status: 1

添加 -v查看详细报错
stap -v  /usr/share/systemtap/examples/io/inodewatch.stp 253 1  4210339
Pass 1: parsed user script and 471 library scripts using 240276virt/41896res/3368shr/38600data kb, in 300usr/20sys/320real ms.
Pass 2: analyzed script: 2 probes, 12 functions, 8 embeds, 0 globals using 399436virt/196284res/4744shr/197760data kb, in 1540usr/560sys/2106real ms.
Pass 3: using cached /root/.systemtap/cache/f5/stap_f5c0cd780e8a2cac973c9e3ee69fba0c_7030.c
Pass 4: using cached /root/.systemtap/cache/f5/stap_f5c0cd780e8a2cac973c9e3ee69fba0c_7030.ko
Pass 5: starting run.
ERROR: module version mismatch (#1 SMP Tue Sep 25 1452 CDT 2018 vs #1 SMP Wed Sep 26 1511 UTC 2018), release 3.10.0-862.14.4.el7.x86_64
WARNING: /usr/bin/staprun exited with status: 1
Pass 5: run completed in 0usr/10sys/38real ms.
Pass 5: run failed.  [man error::pass5]

修改

vim /usr/src/kernels/3.10.0-862.14.4.el7.x86_64/include/generated/compile.h

#define UTS_VERSION "#1 SMP Tue Sep 25 1452 CDT 2018"
改为
#define UTS_VERSION "#1 SMP Wed Sep 26 1511 UTC 2018"

rm -rf  /root/.systemtap/cache/f5/stap_f5c0cd780e8a2cac973c9e3ee69fba0c_7030*

再次执行

stap /usr/share/systemtap/examples/io/inodewatch.stp 253 1 4210339

iostat(4671) vfs_write 0xfd00001/4210339
iostat(4671) vfs_write 0xfd00001/4210339
iostat(4671) vfs_write 0xfd00001/4210339
iostat(4671) vfs_write 0xfd00001/4210339
iostat(4671) vfs_write 0xfd00001/4210339
iostat(4671) vfs_write 0xfd00001/4210339
iostat(4671) vfs_write 0xfd00001/4210339
iostat(4671) vfs_write 0xfd00001/4210339
iostat(4671) vfs_write 0xfd00001/4210339
iostat(4671) vfs_write 0xfd00001/4210339
iostat(4677) vfs_write 0xfd00001/4210339
iostat(4677) vfs_write 0xfd00001/4210339
iostat(4677) vfs_write 0xfd00001/4210339
iostat(4677) vfs_write 0xfd00001/4210339
iostat(4677) vfs_write 0xfd00001/4210339
iostat(4677) vfs_write 0xfd00001/4210339
iostat(4677) vfs_write 0xfd00001/4210339
iostat(4677) vfs_write 0xfd00001/4210339
iostat(4677) vfs_write 0xfd00001/4210339
iostat(4677) vfs_write 0xfd00001/4210339
iostat(4683) vfs_write 0xfd00001/4210339
............

可见已经得到了写/tmp/iostat_date +%F文件的进程号,但进程号一直在打印出来,因为后台进程iostat -dx -m 的在while循环中的,每隔sleep 2s 后就会执行一次iostat 产生新的pid。
那要怎样才能让iostat -dx -m 停止写/tmp/iostat_date +%F文件了?除了重启大法好 $_$

rm -rf 也不能终止后台的while iostat进程写文件,删除了文件后,while循环又会生成新的文件

rm -rf  /tmp/iostat_2019-03-1*

stat /tmp/iostat_2019-03-1*
  File: ‘/tmp/iostat_2019-03-13’
  Size: 146700    Blocks: 512        IO Block: 4096   regular file
Device: fd01h/64769dInode: 4210339     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-03-14 1626.211888899 +0800
Modify: 2019-03-14 1617.854019793 +0800
Change: 2019-03-14 1617.854019793 +0800

正确做法

cat>/tmp/iostat.sh<while [ 1 ];do echo -n `date +%T` >>/tmp/iostat_`date +%F` 2>& 1  && iostat -dx -m 1 1 >>/tmp/iostat_`date +%F` 2>& 1; sleep 2; done &
EOF

at  now + 1 minute  today
bash /tmp/iostat.sh

#这样就能方便的获取到进程号pid了
ps -ef | grep iostat
root      8593     1  0 16:16 pts/2    0000 bash /tmp/iostat.sh
审核编辑:郭婷
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11304

    浏览量

    209535
  • 服务器
    +关注

    关注

    12

    文章

    9165

    浏览量

    85436

原文标题:查看 Linux 文件占用进程写数据?

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    深入解析Linux程序与进程

    什么是程序 一组计算机能识别和执行的指令,用于指导计算机执行特定任务或解决特定问题。程序通常由代码、数据和资源文件组成,涉及语法、算法和数据结构。为二进制文件 什么是
    的头像 发表于 12-18 11:01 88次阅读
    深入解析<b class='flag-5'>Linux</b>程序与<b class='flag-5'>进程</b>

    使用lsof实现对linux文件的误删除恢复练习

    lsof命令的帮助,恢复该日志数据 确保当前nginx进程运行中 [root@master10 ~]# systemctl status nginx 查看nginx日志文件 [root
    的头像 发表于 11-24 11:14 190次阅读
    使用lsof实现对<b class='flag-5'>linux</b><b class='flag-5'>文件</b>的误删除恢复练习

    一文搞懂Linux进程的睡眠和唤醒

    优先级、文件描述符(记录当前进程打开的文件)、主要进程标识的进程号和父进程号:
    发表于 11-04 15:15

    Linux lsof命令的基本用法

    linux 系统中,一切皆文件。通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 lsof 命令不仅可以查看
    的头像 发表于 10-23 11:52 266次阅读
    <b class='flag-5'>Linux</b> lsof命令的基本用法

    Linux用户身份与进程权限详解

    在学习 Linux 系统权限相关的主题时,我们首先关注的基本都是文件的 ugo 权限。ugo 权限信息是文件的属性,它指明了用户与文件之间的关系。但是真正操作
    的头像 发表于 10-23 11:41 354次阅读
    <b class='flag-5'>Linux</b>用户身份与<b class='flag-5'>进程</b>权限详解

    Linux服务器性能查看方法

    Linux服务器性能查看是系统管理员和开发人员在日常工作中经常需要进行的任务,以确保系统稳定运行并优化资源使用。以下将详细介绍多种Linux服务器性能查看的方法,这些方法涵盖了CPU、
    的头像 发表于 09-02 11:15 1070次阅读

    深入探讨Linux进程调度器

    Linux操作系统作为一个开源且广泛应用的操作系统,其内核设计包含了许多核心功能,而进程调度器(Scheduler)就是其中一个至关重要的模块。进程调度器负责决定在任何给定的时刻哪个进程
    的头像 发表于 08-13 13:36 952次阅读
    深入探讨<b class='flag-5'>Linux</b>的<b class='flag-5'>进程</b>调度器

    Linux查看IP地址的方法

    ifconfig是一个网络管理工具,用于配置、控制和查询网络接口。在许多旧的Linux发行版中,ifconfig是查看和配置网络接口的主要工具。
    的头像 发表于 08-07 15:16 7584次阅读
    在<b class='flag-5'>Linux</b>中<b class='flag-5'>查看</b>IP地址的方法

    恒讯科技分析:香港服务器的linux如何显示文件内容?

    Linux系统中查看文件内容有多种方法,以下是一些常用的命令: 1、使用cat命令:这是最基本和常用的查看文件内容的方法。你可以直接输入c
    的头像 发表于 07-19 12:49 226次阅读

    安卓15调整存储设置,系统细分系统文件与临时文件

    目前,安卓手机用户在存储设置中可查看各类型文件占用空间的详细数据,如应用程序、文档、图片、游戏、音频等,以及“系统”(System)空间内的基本系统
    的头像 发表于 05-17 14:32 686次阅读

    linux下查询进程占用的内存方法有哪些?

    linux下查询进程占用的内存方法
    发表于 04-08 06:03

    linux怎么查看网卡的收光功率?

    linux怎么查看网卡的收光功率? 在Linux系统中,可以使用一些命令和工具来查看网卡的收光功率。本文将介绍如何使用这些命令和工具来查看
    的头像 发表于 01-31 14:24 3684次阅读

    浅谈Linux进程

    进程和程序的区别: 进程是动态的,程序是静态的 一、进程的创建(fork()函数) int main(){ pid_t pid; pid=fork(); if(pid     >0
    的头像 发表于 01-28 15:54 259次阅读
    浅谈<b class='flag-5'>Linux</b>的<b class='flag-5'>进程</b>

    如何查看GD32 Keil和IAR工程的map文件

    我们在设计调试程序时,往往需要知道一个函数或一个变量它在MCU中具体所在的地址以及所占用的空间大小,这时候就需要查看map文件。 那么什么是map文件呢?map
    的头像 发表于 01-27 09:30 2622次阅读
    如何<b class='flag-5'>查看</b>GD32 Keil和IAR工程的map<b class='flag-5'>文件</b>

    Linux查看IO状态的常用命令都有哪些呢?

    介绍下Linux的3个常用I/O相关命令,解决I/O压力过大问题时用iostat,查看磁盘的I/O状态用iotop,查看I/O进程排名用lsof
    的头像 发表于 01-16 09:28 5384次阅读