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
    • 最新
    • 标签
主页 / user-677

mark's questions

Martin Hope
mark
Asked: 2019-03-23 07:07:38 +0800 CST

php-fpm 重置 opcache 时产生大量负载,导致服务器无响应

  • 2

最近几周,我们在部署代码时遇到了一个负面现象:服务器有时会在几分钟内无响应。

这是发生这种情况时服务器上的负载示例: 在此处输入图像描述

我能找到的唯一相关日志来自/var/log/php7.2-fpm.log,有时(但并非总是)我会看到这样的条目(注意:这是来自与上图所示不同的事件,但同样会发生):

[22-Mar-2019 15:33:50] WARNING: [pool api] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 231 total children
[22-Mar-2019 15:33:52] WARNING: [pool api] server reached pm.max_children setting (250), consider raising it
[22-Mar-2019 15:34:05] WARNING: [pool app] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 47 idle, and 104 total children

发生的事情是我们对该服务器进行了部署:

  • git status --porcelain检查修改
  • git pull origin master更新文件
  • 重置 opcache,即我们调用一个端点来执行opcache_reset()
  • 清除本地缓存文件

经过一些试验,我可以将负载问题减少到这样:opcache_reset()

一旦我执行了这个调用(独立于任何之前或之后的部署步骤,当我只调用这个端点时,这也是孤立地发生的),系统负载有可能突然飙升。

如果发生这种情况并且负载“太高”(根据经验我会说 > 200 左右),系统会在几秒钟或几分钟内没有响应,这取决于一切需要多长时间才能平静下来。

眼镜:

  • 在 VMWare 上运行的 VM(不是我们自己托管的,我们有合作伙伴)
  • 4 个 vCPU
  • 8GB 内存
  • 8GB 交换空间
  • Ubuntu 18.04 TS
  • nginx 1.14.0(Ubuntu 默认)
  • PHP 7.2(通过https://launchpad.net/~ondrej/+archive/ubuntu/php)

PHP-FPM 配置:

  • 我们正在使用具有不同虚拟主机的 6 个池
  • start_servers直接总计320 个php -fpm 进程(也通过 确认ps auxw|grep -i fpm|grep -v grep |wc -l)
  • 所有池的总数max_children约为870

也许这里的总数太高了,目的是为了应对个别虚拟主机上的峰值,有时碰巧有.

使用htop,系统通常如下所示: 在此处输入图像描述

通常负载很低,除非我们有这个与 opcache 重置有关的峰值(我最近才发现) :在此处输入图像描述

我知道重置缓存现在所有进程都必须重新填充它是消耗 CPU 的。

但我不明白的是:

  • 这只是最近才开始发生,例如可能 1-2 个月,但仅在最近两周内,反应迟钝才明显
  • 它并不总是发生,有时在重置缓存时,什么也没有发生

这是opcache_get_status(false)部署之前的输出:

{
  "opcache_enabled": true,
  "cache_full": false,
  "restart_pending": false,
  "restart_in_progress": false,
  "memory_usage": {
    "used_memory": 67353640,
    "free_memory": 66864088,
    "wasted_memory": 0,
    "current_wasted_percentage": 0
  },
  "interned_strings_usage": {
    "buffer_size": 8388608,
    "used_memory": 5215176,
    "free_memory": 3173432,
    "number_of_strings": 89109
  },
  "opcache_statistics": {
    "num_cached_scripts": 2873,
    "num_cached_keys": 5063,
    "max_cached_keys": 7963,
    "hits": 633581523,
    "start_time": 1553172771,
    "last_restart_time": 1553248200,
    "oom_restarts": 0,
    "hash_restarts": 0,
    "manual_restarts": 6,
    "misses": 9512,
    "blacklist_misses": 0,
    "blacklist_miss_ratio": 0,
    "opcache_hit_rate": 99.9984987161316
  }
}

之后在这里:

{
  "opcache_enabled": true,
  "cache_full": false,
  "restart_pending": false,
  "restart_in_progress": false,
  "memory_usage": {
    "used_memory": 57745856,
    "free_memory": 76471872,
    "wasted_memory": 0,
    "current_wasted_percentage": 0
  },
  "interned_strings_usage": {
    "buffer_size": 8388608,
    "used_memory": 4337168,
    "free_memory": 4051440,
    "number_of_strings": 75163
  },
  "opcache_statistics": {
    "num_cached_scripts": 2244,
    "num_cached_keys": 3925,
    "max_cached_keys": 7963,
    "hits": 5893926,
    "start_time": 1553172771,
    "last_restart_time": 1553265235,
    "oom_restarts": 0,
    "hash_restarts": 0,
    "manual_restarts": 7,
    "misses": 4962,
    "blacklist_misses": 0,
    "blacklist_miss_ratio": 0,
    "opcache_hit_rate": 99.91588245106536
  }
}

我观察到的其他事情:

  • php-fpm 很快停止响应
  • 除非负载真的很高,否则 nginx 仍然可以工作;我确认了这一点,因为当 php-fpm 基本上无法访问时,nginx 会交付配置的 500 页面

是什么真正导致了这些负载峰值?我怎样才能避免它们?

接受答案后更新:

基本上只是不调用opcache_reset 并将我的大部分 opcache 设置自定义恢复为默认值(即不强加它们)修复它。

这一步是我多年来部署管道的一部分。我试图找出最初的原因,据我所知,当类引用尚未加载/刷新的新代码时,它与部署问题有关。

事后看来,我什至不确定这是不是真正的问题,但我们到了。

nginx
  • 1 个回答
  • 620 Views
Martin Hope
mark
Asked: 2013-06-24 14:34:00 +0800 CST

让清漆在获取新数据时从缓存中发送旧数据?

  • 8

我正在缓存动态生成的页面(PHP-FPM、NGINX)并在它们前面有清漆,这很好用。

但是,一旦达到缓存超时,我会看到:

  • 新客户请求页面
  • varnish 识别缓存超时
  • 客户等待
  • varnish 从后端获取新页面
  • varnish 向客户端提供新页面(并且也缓存了页面,以供下一个立即获取它的请求)

我想做的是:

  • 客户请求页面
  • varnish 识别超时
  • varnish 将旧页面交付给客户端
  • varnish 从后端获取新页面并将其放入缓存中

就我而言,过时信息不是一个大问题的网站,尤其是当我们谈论几分钟后的缓存超时时。

但是,我不想惩罚用户排队等候,而是立即交付一些东西。这在某种程度上可能吗?

为了说明,下面是对我的服务器运行 siege 5 分钟的示例输出,该服务器配置为缓存一分钟:

HTTP/1.1,200,  1.97,  12710,/,1,2013-06-24 00:21:06
...
HTTP/1.1,200,  1.88,  12710,/,1,2013-06-24 00:21:20
...
HTTP/1.1,200,  1.93,  12710,/,1,2013-06-24 00:22:08
...
HTTP/1.1,200,  1.89,  12710,/,1,2013-06-24 00:22:22
...
HTTP/1.1,200,  1.94,  12710,/,1,2013-06-24 00:23:10
...
HTTP/1.1,200,  1.91,  12709,/,1,2013-06-24 00:23:23
...
HTTP/1.1,200,  1.93,  12710,/,1,2013-06-24 00:24:12
...

我忽略了数百个正在运行的请求0.02。但我仍然担心会有用户不得不等待将近 2 秒才能获得原始 HTML。

我们不能在这里做得更好吗?

(我遇到了Varnish send while cache,听起来很相似,但不完全是我想要做的。)

解决方案

Shane Madden 的回答包含了解决方案,但我没有立即意识到。还有一个细节我没有包含在我的问题中,因为我认为它不相关,但实际上它是。

我目前使用的 CMS 解决方案有一个 varnish 数据库侦听器,因此能够通知 varnish 禁止内容已更改的页面。它使用一些正则表达式发送PURGE请求以禁止某些页面。

总结一下,有两种情况我遇到了不幸的用户:

  1. 页面的普通清漆 TTL 过期
  2. 后端用户更改内容,这会向清漆发送清除请求

在这两种情况下,我都有“不幸”的用户。在第二种情况下,后端用户通常会在页面更改后检查页面,从而缓解了这种情况;但不一定。

尽管如此,对于第二种情况,我创建了一个解决方案(是的,我意识到这个问题始于为第一种情况寻求答案......我的问题表述不佳):

我没有发送清除请求,而是使用 Shanes 建议并调整了 VCL,以便我的 varnish 数据库侦听器可以发送特殊请求来获取hash_always_miss设置为的页面true。

在当前架构下,我并没有真正做一个真正的异步请求的奢侈,但是在我如何在 PHP 中发出异步 GET 请求的帮助下?我能够制作一个 GET 请求来清漆,它不会等待页面加载,但足以触发清漆从后端获取页面并缓存它。

最终结果是数据库侦听器将请求发送到清漆,当我轮询特定页面时,它从来没有让我的请求“不走运”,但是一旦清漆从后端完全获取页面(这可能从 300 毫秒到 2 秒)它突然出现了。

我还必须找到一个解决方案如何在正常 TTL 用完时避免同样的问题,但我想这个解决方案也完全像 Shane 建议的那样:使用 wget 触发hash_always_miss,我只需要足够聪明就可以获取列表我必须刷新的页面。

performance
  • 3 个回答
  • 8801 Views
Martin Hope
mark
Asked: 2013-04-08 03:16:47 +0800 CST

linux-vserver 中的 Apache 无法启动,无法创建套接字

  • 8

在广泛的研究和测试中,为了编写一个值得 stackexchange 的正确问题,我找到了一个解决方案:libapr1在来宾内部重建包。
我想我还是会发布这些信息,因为它可能对其他人有用。

问题

当我libapache2-mod-php5在 Wheezy 来宾中安装并尝试启动时,我得到以下信息:

root@test01:~# /usr/sbin/apache2ctl start
[crit] (22)Invalid argument: alloc_listener: failed to get a socket for (null)
Syntax error on line 9 of /etc/apache2/ports.conf:
Listen setup failed
Action 'start' failed.
The Apache error log may have more information.
root@test01:~# tail /var/log/apache2/error.log
root@test01:~#
root@test01:~# head -n 9 /etc/apache2/ports.conf|tail -n 1
Listen 80

这是未更改的原始包安装,默认情况下无法启动。

我的测试

根据官方文档,Listen 80其实是可以的。把它变成Listen 127.0.0.1:80给我:

[crit] (22)Invalid argument: alloc_listener: failed to get a socket for 127.0.0.1
Syntax error on line 9 of /etc/apache2/ports.conf:
Listen setup failed
Action 'start' failed.

那么为什么 Apache 无法获得套接字呢?我有其他守护进程在运行(即 nginx 在其他 Wheezy 安装上;exim4 在同一安装上侦听端口 25)没有问题。

环境

主持人

2.6.26-2-vserver-amd64 上的 Debian Lenny

# vserver-info
Versions:
                   Kernel: 2.6.26-2-vserver-amd64
                   VS-API: 0x00020303
             util-vserver: 0.30.216-pre2772; Dec 13 2008, 04:56:19

Features:
                       CC: gcc, gcc (Debian 4.3.2-1) 4.3.2
                      CXX: g++, g++ (Debian 4.3.2-1) 4.3.2
                 CPPFLAGS: ''
                   CFLAGS: '-Wall -g  -O2 -std=c99 -Wall -pedantic -W -funit-at-a-time'
                 CXXFLAGS: '-g -O2 -ansi -Wall -pedantic -W -fmessage-length=0 -funit-at-a-time'
               build/host: x86_64-pc-linux-gnu/x86_64-pc-linux-gnu
             Use dietlibc: yes
       Build C++ programs: yes
       Build C99 programs: yes
           Available APIs: v13,net,v21,v22,v23,netv2
            ext2fs Source: e2fsprogs
    syscall(2) invocation: alternative
      vserver(2) syscall#: 236/glibc
               crypto api: beecrypt
   use library versioning: yes

Paths:
                   prefix: /usr
        sysconf-Directory: /etc
            cfg-Directory: /etc/vservers
         initrd-Directory: $(sysconfdir)/init.d
       pkgstate-Directory: /var/run/vservers
          vserver-Rootdir: /var/lib/vservers


Assumed 'SYSINFO' as no other option given; try '--help' for more information.

来宾

Debian Wheezy,构建于vserver $VSERVER build -m debootstrap --hostname $VSERVER --netdev eth0 --context $CONTEXT --interface v$CONTEXT=x.y.z.$CONTEXT/zz -- -d wheezy -m http://apt-proxy:9999/debian/

研究至今

到目前为止,互联网为我提供了以下内容:

  • 通过升级 APR 解决了 fedorra 上的问题
  • 升级包解决的问题
  • 内核不兼容
  • 另一个解决方案需要内核升级

我最大的恐惧,也是我目前的结论,是虚拟服务器中的 apache 依赖于我的主机不提供的一些较新的内核功能。毕竟,Wheezy 默认内核肯定没有我的 2.6.26 旧。

我想不惜一切代价避免升级主机内核。

为什么?

  • 缺乏时间和知识(硬件是 HP 服务器,不知道要注意什么)
  • Wheezy 不再支持虚拟服务器(开箱即用;自行安装请参见 1)...)
  • 已经在运行需要 24/7 全天候可用的虚拟服务器(整个系统是公司内部的,不暴露在互联网上)
  • 没有第二个相同的硬件来执行测试

我愿意为 Apache 打补丁

如果可以找出问题所在,我愿意为我的 Wheezy 任务构建一个自定义 deb 包。

apache-2.2
  • 1 个回答
  • 6703 Views
Martin Hope
mark
Asked: 2012-08-11 03:17:51 +0800 CST

Windows:作为普通用户的远程网络路由(具有特权脚本/可执行文件?)?

  • 0

系统:Windows XP SP3 Professional,Active Directory 的一部分

我们有义务在选定的工作站上使用 VPN 网络客户端 (CheckPoint),选定的用户拥有该 VPN 客户端的证书/密码。他们可以在没有任何提升权限的情况下以普通用户身份运行和连接到 VPN。

问题:我们这里有网络冲突。我们公司在 10.xzy 中使用两个网络,处理 VPN 的远程公司也是如此。

他们的路由非常非常自由,例如10.8.0.0/255.248.0.0,这也掩盖了我们的内部10.15.x.z网络。

提供 VPN 的公司不会或不能更改其客户创建的路由。因此,我尝试以至少与我们内部网络的连接仍然有效的方式删除路由。

但我什至无法像普通的非特权用户一样删除路由。我真的不知道如何解决这个问题。

我现在唯一的想法是:拥有一些软件,用户可以在连接到修改路由表的 VPN 后运行这些软件,这样内部网络路由就不会进入远程 VPN 网络。显然,该软件需要提升权限。我什至不知道如何让非特权域用户只能运行在此 PC 上提升的某个软件/脚本。或者如果这是个好主意......

感谢您的任何提示

networking
  • 2 个回答
  • 139 Views
Martin Hope
mark
Asked: 2009-10-10 10:46:04 +0800 CST

“设备上没有剩余空间”,df 显示不符

  • 15

几个小时前,我的根分区填满了,我将文件从它移开,df 报告:

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda1             183G  174G     0 100% /

所以应该有 9GB 可用空间,但可用性报告为 0,使用率仍为 100%。

我以root身份进行了测试,例如

# echo test >a ; cat a
test

它按预期工作;但是作为普通用户,我仍然收到错误:

$ echo test >a ; cat a
bash: echo: write error: No space left on device

我进行正面测试的根主目录和我的主目录在同一个分区上。fstab 条目是:

/dev/hda1 / ext3 noatime,defaults,errors=remount-ro 0 1
linux
  • 6 个回答
  • 39133 Views
Martin Hope
mark
Asked: 2009-08-24 00:43:56 +0800 CST

我在哪里可以控制系统关闭的临界温度?

  • 0

由于温度问题,我最近关闭了几次:

Aug 23 06:50:19 genuine ACPI: Critical trip point
Aug 23 06:50:25 genuine Critical temperature reached (57 C), shutting down.

但是我不认为 57 C 是一个真正的问题,并希望增加数量。

问题:我在哪里可以做到这一点?

正如 fpmurphy 所问的那样;trip_points 的输出是:

critical (S5):           75 C
passive:                 73 C: tc1=4 tc2=3 tsp=60 devices=0xdd987338 
active[0]:               73 C: devices=0xdd987dd8 
linux
  • 2 个回答
  • 3124 Views
Martin Hope
mark
Asked: 2009-07-09 09:43:19 +0800 CST

使用 SBS 2003 SP2 作为 LAN 网关会导致大量 HTTP 超时

  • 0

通过在 SBS 2003 SP2 上运行的 ISA 作为 LAN 网关,无论 LAN 中有多少客户端正在运行,我都会看到任何外部服务的大量 HTTP 超时。服务器有两张网卡:一张用于 LAN/DMZ(不同的 IP 范围;在一个端口上使用虚拟 LAN),一张用于 WAN。ISA 不用作 Web 代理,我使用各种工具验证了超时,从通常的可视化浏览器到 wget 和 telnet 以及在 PHP 应用程序中。

我使用了一些脚本和 rrdtool 制作了这个图表,它测量了外部资源的加载时间(我已经测试了七个不同的外部网站,当然具有适当的权限,以测试加载时间;所有看起来都一样);单位(见左图)以秒为单位;我在收集数据时设置了 30 秒的最大超时。

(注意:此图像大小约为 270kb,宽 16000 像素!) ISA Timeout RRD 图 http://markus.fischer.name/tmp/isa_timeout.png

该图跨越 24 小时;从大约 11 点到 13:20 的中断是由于重新配置(显然没有改变任何东西)。

我已经验证了以下几点:

  • 从 LAN/DMZ 通过服务器到 WAN 的流量导致超时
  • 从服务器到 WAN 的流量不会导致 超时
  • 从 LAN/DMZ 到服务器的流量不会 导致超时

硬件,如开关和电缆,已经过验证不会导致这种情况。

更新:

我决定采取更高的态度并为该问题打开 M$ 支持票。我会在收到更新时附加更新。

更新 2:

两周过去了,进展不大。实际上,我自己不会去追票,但我们有一家公司会为我们做这件事。我认为这是一个聪明的举动,节省了我做其他事情的时间。

无论如何,这张票在第一周就被 M$ 遗忘了,因此直到上周才有进展,导致 ISA 的补丁被部署,不幸的是,这并没有改变任何东西。

下一步是他们要求他们昨天收到的大量报告信息。

更新 3:

现在是8月10日。这个问题在 8 月 6 日突然消失了。就在中午 11:17 左右,发生了最后一次永久测量的超时。从那时起,在这种类型的场景中,无法检测到来自没有网络、没有外部主机的此类问题。

不可能有任何单一的行动与这次突然失踪保持联系。前一天晚上是公司内部的部分停电,在 12:30 我们重置了一些在停电后没有完全恢复的硬件(我们才知道问题一直持续到今天下午晚些时候)。

来自我的支持公司以及 M$ 本身,除了收集日志和报告之外,到目前为止,在此之前和之后都没有出现任何问题。由于时间就是金钱,我现在必须暂停对此的进一步研究......

isa-server timeout
  • 4 个回答
  • 243 Views
Martin Hope
mark
Asked: 2009-05-21 01:54:09 +0800 CST

如何找到产生流量的客户?

  • 3

我们正在运行 SBS 2003 SP2,我想知道是否有任何简单的方法可以找出特定时间段内的流量是从哪里生成的?

就我而言,每天的总流量消耗大约是 8GB。我不关心一般流量(那些 8GB 主要包括在夜间传输备份文件),但在特定时间范围内。

举个例子:早上 10 点 30 分,互联网连接速度突然变慢了。我检查了我们的自动备份和其他传输服务,但它们都没有运行。我仍然有一个网络,大约 15 台 PC 分散在建筑物周围,这可能会产生流量。

我们只有一条 2MBit 的小线路,因此在办公时间线路可以很快饱和。我不怀疑任何用户做错了什么,我认为有一些软件自动化的事情正在发生,但我不确定。也许是 Windows 或 Adob​​e 自动下载,但我怎么能确定呢?

我已经在查看从 ISA 2004 生成的报告并看到很多数字,但我无法确定哪个客户端在哪个时间范围内生成了流量。

通过转到任务管理器中的网络选项卡,我可以看到服务器本身的峰值,我看到外部 100Mbit 接口为 2% == 2Mbit,但我无法弄清楚它实际上来自哪里。

我想我可以排除是服务器本身产生流量,因为来自外部接口的流量图与为我的用户服务的 LAN 接口匹配(我们的 DMZ 接口,其中包含我们的自动备份服务,当时为 0 )。

我该如何进一步解决这个问题?

isa-server traffic
  • 6 个回答
  • 2657 Views
Martin Hope
mark
Asked: 2009-05-01 08:58:27 +0800 CST

严重的写入性能问题

  • 4

[对不起,我试图保持简短,但这是不可能的]

我在 Fujitsu Siemens Primergy RX200 S3 上运行 Linux 2.6.22.19 和linux - vserver 2.3.0.34用于开发目的。Intel(R) Xeon(R) 5140 @ 2.33Ghz,4GB RAM(其中大部分 500MB 仍然可用)。服务器有两个热插拔 250GB 用于镜像 RAID 配置:

dev:~# mpt-status --newstyle
ioc:0 vol_id:0 type:IM raidlevel:RAID-1 num_disks:2 size(GB):231 state: OPTIMAL flags: ENABLED
ioc:0 phys_id:0 scsi_id:1 vendor:ATA      product_id:WDC WD2500JS-55N revision:2E01 size(GB):232 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff
ioc:0 phys_id:1 scsi_id:8 vendor:ATA      product_id:WDC WD2500JS-55N revision:2E01 size(GB):232 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff
scsi_id:0 100%
scsi_id:1 100%

我正在运行LVM和 ext3。

我们从 2007 年 7 月/8 月左右开始使用这台机器,除了同一天修复的损坏的 RAM 之外,没有任何问题。而且,基本上,一切都比我们以前的机器好。

然而,性能问题是在 2008 年 8 月左右首次发现的,直到最近我才对问题的出处充满信心。现在平均有七台虚拟服务器在运行(三台 MySQL 机器、两台 tomcat、三台 Apache、Hudson、CruiseControl、MediaWiki、Samba 等)。但不要产生错误的印象,就开发人员和其他访问服务器的人而言,我们是一家小公司,所以没有那么多事情发生(浏览 MediaWiki,Hudson 自动化在晚上运行,大多数 Apache/PHP 应用程序有很多静态内容)。

安装 munin 后,我开始看到有趣的东西,尤其是在夜间。由于在每个虚拟服务器中都在find运行(同时,无处不在)负载猛增到像 15、17 或 20 这样的虚数。

但最终问题不仅存在于夜间(我开始禁用查找工作,反正没有使用),而且还存在于白天,尤其是当我们最近开始一个项目时,我们必须使用数据库一个 500MB 的 MySQL 转储文件。

我第一次在工作时间导入转储文件(mysql < dump.sql; 在我们的一个运行 MySQL 实例的虚拟服务器中),定时输出是:

real    71m28.630s
user    0m15.477s
sys     0m10.185s

由于我没有注意并且正在开会,所以只是我的同事问我服务器出了什么问题,因为他非常慢。

我在晚上重新进行了测试,在主机上安装了一个 vanilla Debian MySQL(不是在来宾内部;关闭所有这些)并达到以下数字:

real    48m33.067s
user    0m15.397s
sys     0m13.517s

我还是觉得是的,很好,这是 500MB 的转储文件;转储到 InnoDB 空间大约需要 1GB,这是相当多的数据。我做了一些测试,比如在这样的测试期间将一行写入文件vim并使用 strace 捕获它:

   0.000048 write(1, "\33[?25l\"foo\" \33[78;7H\33[K", 22) = 22
   0.000033 stat64("foo", 0xbfda1f04) = -1 ENOENT (No such file or directory)
   0.000033 open("foo", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
   0.000035 write(4, "thios isthis ia a testa\n", 24) = 24
   0.000144 fsync(4)            = 0
7737.631089 stat64("foo", {st_mode=S_IFREG|0664, st_size=24, ...}) = 0
   0.000084 close(4)            = 0
   0.000117 write(1, "\33[78;7H[New] 1L, 24C written", 28) = 28
   0.000051 lseek(3, 0, SEEK_SET) = 0
   0.000022 write(3, "b0VIM 7.0\0\0\0\0\20\0\0\0\0\0\0\0\0\0\0!\21\0\0mark"..., 4096) = 4096
   0.000052 select(1, [0], NULL, [0], {0, 0}) = 1 (in [0], left {0, 0})

这对我来说是一个令人难以置信的事实数字。似乎 stat64 系统调用被迫等待转储操作完成。更不用说在这样的转储期间在 MediaWiki 中提供页面也需要几分钟。

无论如何,我与我们的托管公司安排了一个测试时间框架,在晚上在我们的生产服务器上进行测试,我得到了完全不同的画面:

real    7m4.063s
user    0m2.690s
sys     0m30.500s

我被吹走了。我还获得了 Amazon EC2 的测试批准,而且我得到的数字更低(在 m1.large 实例上大约 5 分钟,其中 MySQL 数据被写入 EBS 卷以保持永久状态)。

此外,在导入数据时,其他所有操作都变得如此缓慢,以至于事情变得无法使用,并且负载迅速上升到 5 或 7(尽管似乎并没有发生太多事情;看起来进程开始相互阻塞现在的理由)。

然后我开始做bonnie++ 测试,看起来像这样(我实际上从去年开始进行了一次测试,但我几乎忘记了)。所以这里是2008 年 10 月:

Version  1.03       ------Sequential Output------ --Sequential Input- --Random-
                    -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
vserver-host     8G 12332  21 12600   3 10290   2 48519  74 52431   6 235.8   0
                    ------Sequential Create------ --------Random Create--------
                    -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++
vserver-host,8G,12332,21,12600,3,10290,2,48519,74,52431,6,235.8,0,16,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++

这是2009 年 4 月的当前版本:

Version  1.03       ------Sequential Output------ --Sequential Input- --Random-
                    -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
vserver-host     8G  9705  16  7268   1  4823   1 29620  45 41336   5  73.1   0
                    ------Sequential Create------ --------Random Create--------
                    -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 11678  15 +++++ +++ +++++ +++ +++++ +++ +++++ +++ 27739  31
vserver-host,8G,9705,16,7268,1,4823,1,29620,45,41336,5,73.1,0,16,11678,15,+++++,+++,+++++,+++,+++++,+++,+++++,+++,27739,31

我不知道在哪里调整什么来摆脱问题,因为我还不完全确定真正的问题在哪里/是什么。我想我开始看不到树木了。

更新1:

感谢到目前为止的反馈,我首先选择了可以轻松测试而无需安排维护时间的东西。

首先,我测试了 MySQL 转储/dev/null:

dev01:~$ time mysqldump -u root -h db01 database-p >/dev/null
Enter password:

real    0m18.871s
user    0m12.713s
sys     0m0.512s

系统负载几乎不引人注意:

 10:27:18 up 77 days,  9:10,  7 users,  load average: 0.16, 0.75, 0.67
[...]
 10:27:33 up 77 days,  9:10,  7 users,  load average: 0.52, 0.79, 0.69

此测试期间的sar输出也没有显示任何特别之处:

12:11:45 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
12:11:46 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:11:46 PM  dev254-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:11:46 PM  dev254-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

12:11:46 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
12:11:47 PM    dev8-0      5.00      0.00    200.00     40.00      0.18     36.00     20.00     10.00
12:11:47 PM  dev254-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:11:47 PM  dev254-1     25.00      0.00    200.00      8.00      0.74     29.60      4.00     10.00

然后我在转储到文件时运行测试:

dev01:~$ time mysqldump -u root -h db01 database -p >foo.sql

real    1m7.527s
user    0m13.497s
sys     0m2.724s

它所花费的时间对我来说并不奇怪,转储以一个 570MB 的文件结束。

但是,负载非常有趣...

 10:30:49 up 77 days,  9:14,  7 users,  load average: 0.76, 0.89, 0.75
 10:30:57 up 77 days,  9:14,  7 users,  load average: 1.34, 1.01, 0.79
 10:31:05 up 77 days,  9:14,  7 users,  load average: 2.13, 1.19, 0.85
 10:31:13 up 77 days,  9:14,  7 users,  load average: 2.68, 1.32, 0.89
 10:31:21 up 77 days,  9:14,  7 users,  load average: 3.79, 1.60, 0.99
 10:31:29 up 77 days,  9:14,  7 users,  load average: 4.05, 1.69, 1.02
 10:31:37 up 77 days,  9:14,  7 users,  load average: 4.82, 1.93, 1.10
 10:31:45 up 77 days,  9:15,  7 users,  load average: 4.54, 1.97, 1.12
 10:31:53 up 77 days,  9:15,  7 users,  load average: 4.89, 2.08, 1.16
 10:31:57 up 77 days,  9:15,  7 users,  load average: 5.30, 2.22, 1.21
 10:32:01 up 77 days,  9:15,  7 users,  load average: 5.12, 2.23, 1.22
 10:32:05 up 77 days,  9:15,  7 users,  load average: 5.03, 2.26, 1.24
 10:32:13 up 77 days,  9:15,  7 users,  load average: 4.62, 2.22, 1.23

......就像sar......

12:16:47 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
12:16:48 PM    dev8-0    116.00      0.00  21712.00    187.17    134.04    559.31      8.62    100.00
12:16:48 PM  dev254-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:16:48 PM  dev254-1   3369.00      0.00  26952.00      8.00   3271.74    481.27      0.30    100.00

12:16:48 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
12:16:49 PM    dev8-0    130.00      0.00  17544.00    134.95    143.78    752.89      7.69    100.00
12:16:49 PM  dev254-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:16:49 PM  dev254-1   1462.00      0.00  11696.00      8.00   2749.12   1407.78      0.68    100.00

12:16:49 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
12:16:50 PM    dev8-0    128.00      0.00  18400.00    143.75    143.68   1593.91      7.84    100.40
12:16:50 PM  dev254-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:16:50 PM  dev254-1    810.00      0.00   6480.00      8.00   1598.99   4911.94      1.24    100.40

在这个测试中,我很快开始vim做一个简单的写测试。自身的加载vim也很缓慢,但我无法从strace. 只有挂起的stat64呼叫再次清晰可见:

0.000050 stat64("bla", 0xbf98caf4) = -1 ENOENT (No such file or directory)
0.000038 open("bla", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
0.000053 write(4, "fooo\n", 5) = 5
0.000051 fsync(4)            = 0
5.385200 stat64("bla", {st_mode=S_IFREG|0664, st_size=5, ...}) = 0
0.000073 close(4)            = 0

我会尽快追加进一步的文件系统测试。

更新 2 / 解决方案:

根据 Mihai 关于 MTP 设备和 RAID 配置的反馈,我对该主题进行了深入研究。通过lspci我检索到 RAID 控制器信息:

dev:~$ sudo lspci|grep -i lsi
05:05.0 SCSI storage controller: LSI Logic / Symbios Logic SAS1068 PCI-X Fusion-MPT SAS (rev 01)

出乎意料的是,a 在http://www.ask.com/web?q=linux+problem+performance+SAS1068上试了一下,发现LSI Logic SAS1068 存在写入性能问题。错误描述进一步链接到博客谈论DELL PE860 性能问题,该问题也使用 SAS1068。

文章提到了LSIUtil 的使用,可从 lsi.com 获得。这篇文章还lsiutil详细介绍了描述如何打开写入缓存的菜单。

毫不奇怪,事实证明这对性能有重大影响。激活前:

dev:~# time (dd if=/dev/zero of=bigfile count=1024 bs=1M; sync)
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 180.902 seconds, 5.9 MB/s

real    3m8.472s
user    0m0.004s
sys     0m3.340s

启用写缓存后:

dev:~# time (dd if=/dev/zero of=bigfile count=1024 bs=1M; sync)
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 43.7899 seconds, 24.5 MB/s

real    0m46.413s
user    0m0.000s
sys     0m3.124s

这就像白天和黑夜,黑白。有时感觉自己很愚蠢是可以的。我可能应该知道 RAID 控制器默认禁用写缓存。

更新 3:

我偶然发现了一个名为diskstat的 munin 插件,它为所有块设备提供了详细的 IO、读/写/等待等图表。作者还有一篇非常不错且详细的博文,标题为Graphing Linux Disk I/O statistics with Munin。

performance linux debian raid lsi
  • 4 个回答
  • 2402 Views

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