AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 426691
Accepted
Haluk
Haluk
Asked: 2012-09-13 02:43:36 +0800 CST2012-09-13 02:43:36 +0800 CST 2012-09-13 02:43:36 +0800 CST

查找 apache 进程正在写入哪些文件?

  • 772

我们有这个 apache 进程,它不时变成 io-bound。使用atop可以看出是写操作。

使用lsof -p <PID>我们可以看到 httpd 进程打开的文件列表。首先我们认为“日志”文件一定是问题所在。所以我们将它们关闭只是为了测试。但是写入操作仍在继续。

我们将继续测试其他一些东西。例如,我们经常使用 php 会话变量。也许 php 会话文件得到了所有的写作。

但是有没有办法快速识别被 httpd 进程写入的文件?这样我们就可以集中精力处理这些文件。

更新:

我们按照建议使用了 strace 命令。这是输出中的两行。

write(23, "\27\0\0\0\3SET CHARACTER SET utf8", 27) = 27
write(23, "\17\0\0\0\3SET NAMES utf8", 19) = 19

我们在此服务器上没有 mysql 进程。那么 strace 是否也显示了正在写入以太网端口的内容?

UPDATE2:在高 io 负载期间,消耗大部分写入资源的进程将以下输出提供给strace -e trace=write -p <PID>:

--- SIGCHLD (Child exited) @ 0 (0) ---
write(9, "!", 1) = 1
write(19, "OPTIONS * HTTP/1.0\r\nUser-Agent: Apache (internal dummy connection )\r\n\r\n", 70) = 70

但是我无法弄清楚这些被写入的位置。

UPDATE3:尝试了以下命令,它将向我显示所有打开以进行写入的文件:

lsof | grep -e "[[:digit:]]\+w"

以下是我无法检查的仅有的两行。其他文件没有显示任何重要的写入活动。是否可以将以下项目暂时写入硬盘?

httpd     14173       apache    9w     FIFO                0,6           205676000 pipe
httpd     14173       apache    1w      CHR                1,3                3346 /dev/null

找到的原因:
最后我们发现 io-boundness 的原因是 php 会话文件。将 php 会话文件移动到另一个硬盘驱动器也会立即将 io-boundness 移动到该硬盘驱动器。可能我们会将会话移动到 Redis 或其他基于内存的系统。有趣的是,尽管下面的答案在技术上是正确的,但它们并没有引导我们找到会话文件,而是让我们继续查看系统的不同点。

apache-2.2
  • 3 3 个回答
  • 3954 Views

3 个回答

  • Voted
  1. Best Answer
    quanta
    2012-09-13T02:50:28+08:002012-09-13T02:50:28+08:00
    strace -e trace=write -p <PID>
    
    • 2
  2. Mike
    2012-09-13T05:07:17+08:002012-09-13T05:07:17+08:00

    我认为 lsof 是查看当前已打开文件的最佳工具

    lsof -p <pid>
    
    • 2
  3. Nosax
    2012-09-13T04:56:55+08:002012-09-13T04:56:55+08:00

    您确定要查看正确的流程吗?每个 apache“服务器”都是一个单独的进程,因此您应该在每个孩子上循环控制(您从StartServers指令中定义的数字开始)。

    要查看连接:

     netstat -nap | grep <pid>
    
    • 1

相关问题

  • Apache Django Mod_Wsgi - 自动重新加载应用程序

  • Apache:对多个虚拟主机使用相同的目录指令

  • Apache 上的子域不工作 - 找不到服务器

  • PHP 作为 CGI 还是 Apache 模块?

  • 避免将某些丢失的文件记录到 Apache2 错误日志中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve