我目前正在 3 台服务器上通过 Nginx 提供会议视频;4 个内核、足够的内存(不使用交换)和 RAID-10,每台服务器有 8 个驱动器。不幸的是 iostat -xd 1 在所有 3 个服务器上都给了我 100% 并且 iotop 显示 Nginx 吃掉了 99-100%。
我一直在考虑分布式 FS(但哪一个有帮助?);除了购买新服务器(涉及所有开销......)之外,还有其他方法可以防止这种情况发生吗?
请注意,无法将视频放入内存中;太多了,而且太大了。分配也不能只在内存中放入几个。
我目前真的在为一个性能问题而苦苦挣扎,当我的数据库服务器处于“重”负载时,我所有的数据库查询比平时多花费 1000 倍。
我有一台运行 ubuntu 12.04 并托管我的 postgresql 9.2 数据库的服务器。服务器在 Hetzner.de 上,它是 EX6s(8 核氙气,32Gb ram 和两个 3T HDD,在使用 ubuntus 软件 raid 的 RAID1 设置中)。当我运行大量查询(我经常在晚上完成)时,我发现几乎所有 CPU 使用量都花在了 CPU I/O 等待上。我安装了新的遗物监控,我似乎找不到任何其他迹象表明可能是这种 CPU I/O 等待的根本原因,这显然是我的性能和吞吐量的瓶颈。
所以问题是,这个 CPU I/O 等待是什么,它在等待什么?
我添加了所有我可以从下面的新遗物中获得的概览图表。我在看什么?一定有明显的瓶颈吧?我应该在哪里潜水?
数据库服务器 CPU 使用率 - 告诉我有问题的邪恶者 https://rpm.newrelic.com/public/charts/cEdIvvoQZCr
数据库服务器平均负载 https://rpm.newrelic.com/public/charts/cMNdrYW51QJ
数据库服务器物理内存 https://rpm.newrelic.com/public/charts/c3dZBntNpa1
数据库服务器磁盘 I/O 使用 - 如您所见,磁盘似乎没有被充分利用(几乎没有) https://rpm.newrelic.com/public/charts/9YEVw6RekFG
数据库服务器网络 I/O (Mb/s) - 该网络是一个千兆内部网络,所有通信都在其上进行。 https://rpm.newrelic.com/public/charts/lKiZ0Szmwe7
按挂钟时间排名前 5 位的数据库操作 https://rpm.newrelic.com/public/charts/dCt45YH12FK
数据库吞吐量 https://rpm.newrelic.com/public/charts/bIbtQ1mDzMI
数据库响应时间 https://rpm.newrelic.com/public/charts/fPcNL8WA6xx
更新:
做完之后,sudo iostat -k 1我开始怀疑了。我得到了很多这样的输出,这是我在 NR 中看不到的:
Device: tps kB_read/s kB_wrtn/s …Run Code Online (Sandbox Code Playgroud) 我一直在使用 LVM 快照来备份 MySQL 数据库。
FLUSH TABLES WITH READ LOCK发布然后lvcreate --snapshot --size 4G等等。由于数据库在快照处于活动状态时处于活动状态,因此snap_percent(用于跟踪快照时文件系统原始状态的增量的快照存储量)开始增加。这snap_percent会受到日复一日的监控,并且在--size达到 80% 时会增加。
我的问题是ZFS 中是否有等效的统计信息或属性来确定快照消耗的空间占池中剩余空间的百分比?显然,我不需要将--size参数传递给,zfs snapshot但如何确定基于该快照的克隆是否接近池的限制。
希望这是有道理的,现在我读到它确实听起来像是一个令人费解的问题。
我在谷歌上做了一些阅读,我做的唯一一件事就是让自己感到困惑。有些人说 count() 有很多记录会比较慢,其他人说你可以缓存数字甚至使用序列......
在具有最佳性能和最低 cpu/ram 使用率的表中计算多行的最佳方法是什么?许多我的意思是 >=500,000 行。
该ionice男子说:页
以空闲 io 优先级运行的程序只会在没有其他程序在定义的宽限期内请求磁盘 io 时获得磁盘时间。
这个“宽限期”在哪里定义?它是否可见/可调(可能通过 /sys)?
我正在尝试构建一个实验来测量 ionice 的效果。我想做的是(根据serverfault 的另一个答案)导致足够频繁的 I/O,以至于足够“好的”进程缺乏任何 I/O。
基于serverfault上的另一个答案,我认为我需要每 250 毫秒对一个常见的 cfq 调度设备进行至少一个实际 I/O 操作。我的想法是编写一个简单的程序,它确实有一个循环
fsync()(强制执行确定的 I/O 操作),usleep()延迟可配置的时间量lseek()截断文件(这样我就不会填满文件系统)然后我使用ionice -c3(空闲调度类)针对公共设备上的一个文件启动程序的一个实例。我同时使用默认(尽力而为)调度类运行各种实例,在公共设备上指定不同的文件(改变延迟值)。
我的假设是,对于“尽力而为”过程中 250 毫秒或更多的延迟值,我会看到“空闲”过程取得的进展;对于小于 250 毫秒的值,我认为“空闲”过程几乎没有进展。
我的观察是这两个过程的性能没有差异。他们都取得了类似的进展。只是为了确定(以防挂钟指示“尽力而为”进程执行 I/O 的速度比每 250 毫秒快得多),我启动了“尽力而为”进程的多个同时实例,指定 no(零)延迟。尽管如此,我仍然没有看到两个调度类中的进程之间的性能差异。
可以肯定的是,我重新检查了调度程序类:
$ cat /sys/block/xvda/queue/scheduler
noop anticipatory deadline [cfq]
Run Code Online (Sandbox Code Playgroud)
关于 cfq 调度程序的工作方式,我缺少什么?
如果重要的话,这是在 2.6.18 内核上。
希望有人能指出我遇到的一些 iSCSI 性能问题的正确方向。我在较旧的 ProLiant DL360 G5 上运行 Openfiler 2.99。双 Xeon 处理器、6GB ECC RAM、英特尔千兆服务器网卡、SAS 控制器和 RAID 5 中的 3 个 10K SAS 驱动器。当我直接从盒子运行一个简单的写测试时,性能非常好:
[root@localhost ~]# dd if=/dev/zero of=tmpfile bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 4.64468 s, 226 MB/s
Run Code Online (Sandbox Code Playgroud)
因此,我创建了一个 LUN,将其连接到另一个运行 ESXi 5.1(Core i7 2600k、16GB RAM、英特尔千兆服务器网卡)的机器上,并创建了一个新的数据存储。一旦我创建了数据存储,我就能够创建并启动一个运行 CentOS 的虚拟机,它有 2GB 的 RAM 和 16GB 的磁盘空间。操作系统安装得很好,我可以使用它,但是当我在 VM 中运行相同的测试时,我得到了截然不同的结果:
[root@localhost ~]# dd if=/dev/zero of=tmpfile bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 26.8786 …Run Code Online (Sandbox Code Playgroud) tl; dr:第一个 CPU 内核始终处于饱和状态,所有其他内核始终负载不足。
一个虚拟机,在基于 Ubuntu 的 Xen XCP 中:
$ uname -a Linux MYHOST 2.6.38-15-virtual #59-Ubuntu SMP Fri Apr 27 16:40:18 UTC 2012 i686 i686 i386 GNU/Linux $ lsb_release -a 没有可用的 LSB 模块。 分销商 ID: Ubuntu 描述:Ubuntu 11.04 发布:11.04 代号:natty
此 VM 有 8 个 CPU 内核。
这个虚拟机上运行着 10 个单线程工作进程,它们通过 FCGI 接口连接到 nginx 服务器(在本地网络端口上侦听)。
在来自 AB 的合成负载下,只有 8 个内核中的第一个内核会加载到 100%(如从 中看到的htop)。它或多或少地始终处于非常高的负载下,所有其他内核的负载从 0% 到 100% 不等,或多或少是随机的(并且这些内核的 CPU 负载在跳动)。
这是我在负载下通常看到的内容htop:
1 [|||||||||||||||||||||||||||||||||||||||||||| …
我们已经设置了一对 GlusterFS 服务器镜像。无需特殊调整,无论官方 RHEL6 RPM 中的 GlusterFS-3.5.1 “开箱即用”什么,这就是我们所拥有的。
集群可以工作,但性能非常糟糕。例如,firefox-31.0.source.tar.bz2通过本地主机上的 GlusterFS 提取一个大的 tarball () 需要长达 44 分钟的时间。直接在同一磁盘上提取相同的文件所需时间不到 2。删除创建的树也存在类似的差异(通过 gluster 需要 10 分钟)...
当然,可以预见的是,需要进行镜像,等等,使用网络的文件系统会更慢——但是慢30 倍?简单地复制大文件速度很快——所以这不是我们所缺乏的带宽。当解压正在运行时,我看到glusterfs(客户端)和glusterfsd(服务器)进程都消耗了大量的 CPU(每个进程大约 10%),但系统仍然保持大约 70% 的空闲状态——两个 gluster 进程都消耗了大量的 CPU。比提取 bzip2 和 tar 更忙......他们在做什么?
我可以做一些调整来显着提高性能吗?或者我应该尝试ceph(或gfarm?)而不是 gluster ?或者对于大量的小文件来说它们都很糟糕?谢谢你!
performance-tuning distributed-filesystems glusterfs ceph glusterfs-3.5
我在我托管的 WordPress 网站上遭到 DoS 攻击。
173.192.109.118 - - [30/Sep/2015:22:31:36 +0000] "POST /xmlrpc.php HTTP/1.0" 499 0 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"
Run Code Online (Sandbox Code Playgroud)
我在访问日志中收到大约 140 个这样的日志nginx(花费了大约 10 秒,所以每秒大约 14 个请求),然后它们切换到 502:
173.192.109.118 - - [30/Sep/2015:22:31:46 +0000] "POST /xmlrpc.php HTTP/1.0" 502 537 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"
Run Code Online (Sandbox Code Playgroud)
此时,PHP-FPM必须重新启动才能恢复站点。
所以,我的问题是:我可以采取什么措施来防止单个攻击者崩溃PHP-FPM?
我的大部分(有限)经验都是与 Apache 相关的,因此任何建议将不胜感激。
我试图对一切设定合理的限制。服务器在负载下有足够的 RAM,因此这似乎不是问题。我刚刚从以下教程中添加了一个速率限制器: https: //www.howtoforge.com/rate-limiting-with-nginx,虽然这似乎延迟了痛苦,但它仍然最终崩溃PHP-FPM。
/var/log/php5-fpm.log除了当我忘记在配置文件中添加前导 / 时引入的几个错误以及重新启动后的一堆成功行之外,似乎没有显示任何有趣或有用的内容:
[30-Sep-2015 23:03:51] ERROR: Unable to create …Run Code Online (Sandbox Code Playgroud) linux ×3
io ×2
ionice ×2
postgresql ×2
storage ×2
ceph ×1
cpu-usage ×1
glusterfs ×1
hard-drive ×1
high-load ×1
hp-proliant ×1
iscsi ×1
lvm ×1
mysql ×1
nginx ×1
openfiler ×1
performance ×1
php-fpm ×1
scheduler ×1
ubuntu ×1
vmware-esxi ×1
zfs ×1