如何优化小型Linux服务器?

如何优化小型Linux服务器?

我有一台小型 Ubuntu 服务器,内存为 512MB,上面运行着几个 php/mysql 网站(约 20 个)。它已经运行了 2 年,没有出现过任何问题。但我认为现在是时候进行一些优化了。

该服务器上托管的网站流量很低,但是随着访问量开始增加,我发现出现了一些 CPU 问题。

我要做的第一件事是确定问题,因此我一直在尝试使用几个命令行工具,例如 top htop apachetop 等,以及用于监控 MySQl 的工作台。使用这些工具很难知道到底发生了什么。例如,我创建了一个在后台运行的 PHP 守护程序,每 10 秒将 CPU 使用率存储在数据库中。如果 CPU 大于 60%,它会存储 apachetop 的输出。这并不是特别有用,因为许多记录都是选项 * HTTP/1.0。此外,它看起来像是最后请求的列表,而不是当前请求。

几秒钟后,当我尝试使用 htop 监视正在发生的事情时,我总是看到大约 15 条记录,例如:

6905 mysql     20   0  462M  110M  5220 S  0.0 21.6  5:29.79 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --port=3306 --socket=/var/run/mysqld/mysqld.sock

另外还有约 15 人喜欢:

23382 www-data  20   0  259M 27384  4820 S  1.3  5.2  0:01.00 /usr/sbin/apache2 -k start

以下是截图:

我不确定是否应该一直打开这么多进程,或者这是我可以优化的地方。我现在可以升级这个服务器,我只是想在升级之前尽可能地优化它。

另外,我打开了慢查询日志,那里只有当服务器的 CPU 超过 90% 时执行的所有查询。这恰恰证实了我使用的 php/mysql(自定义)不是很重。我可以说流量更大的网站每天有 300 个独立访问者和 1200 次页面浏览量。所有其他网站的流量都低得多。

1)我正在寻找如何有效监控该服务器的建议。

2) 我需要有关 MySQl 和 PHP 的建议。例如,我应该为它们分配多少内存或应该打开/关闭哪些选项。

谢谢!

以下是 htop 的截图链接:http://www.flickr.com/photos/58586868@N02/5375745794/

答案1

从我之前的一些帖子中,大家可能猜到了,我到处都在运行 collectl。从 sourcefore 下载/安装 rpm,然后运行“/etc/init.d/collectl start”,就大功告成了。它将以低于 0.1% 的 CPU 占用率每 10 秒收集数百个性能指标。它还将每分钟拍摄一次进程数据快照,因为这是一个更重的操作。然后,您可以以各种格式回放收集的数据,甚至可以使用基于 Web 的工具 colplot 绘制数据,该工具是 collectl-utils 包的一部分。

仅查看系统运行情况的简要和/或不完整图片并不能帮助您实现目标。您需要更长期的精细数据图片,以便深入研究以了解实际发生的情况。

-标记

答案2

如何调整运行 Apache、PHP 和 MySQL 的 Linux 服务器至少需要写满 4 本厚书 - 而且没有神奇的解决方案。

然而,根据我的经验,LAMP 堆栈上的大多数性能问题都是编写不当的数据库查询。您已经将其视为导致您认为的性能问题的可能原因 - 我建议您回头仔细研究一下。

整理好数据库后,需要检查的其他事项是压缩所有 html、javascript 和 css(mod_gzip)以及 PHP 生成的 HTML(输出缓冲)。请确保运行操作码缓存(如 APC)。并确保使用合理的缓存信息提供所有静态内容。

系统指标可以很好地告诉你系统的性能是如何受到限制的 - 而不是实际的性能。开始在 apache 日志中记录 %D,并分析结果以了解你的系统实际运行情况. 优先对总数最高的 URL 进行优化。

您从系统提供的详细信息是非常上下文 - 假设您的网络服务器设置正确,他们认为 CPU 使用率主要归因于 mysql - 但如果网络服务器配置错误,则情况可能相反。

如果您提供 apache 配置(较少的评论)将会很有帮助。

我打开了慢查询日志,那里唯一的查询是服务器 CPU 超过 90% 时执行的所有查询

听起来你设置的阈值太高了。尝试将阈值设置为 0,然后编写一个解析器来从查询中剥离参数,以识别哪些查询确实很慢。或者只是找到一个已经写好的

答案3

您的表可能随着时间的推移而增长,并且您在 mysql 缓冲区上丢失了数据。尝试找出您的表是 MyISAM 还是 InnoDB 类型,并相应地调整缓冲区设置。

如果您不使用 InnoDB,请将其关闭。InnoDB 使用 innodb_buffer_pool_size 设置缓冲区,而 MyISAM 使用 key_buffer。您可以在 mysqladmin 变量中找到这两个值。

随着表的增长,以前快速的相同查询变得越来越慢。

关于了解计算机在做什么?这很难。尝试找出系统繁忙的确切时间,并检查系统和用户的 crontab 以及 Web 服务器访问日志。

答案4

您需要更多信息。服务器是否总是运行缓慢?还是仅在特定时间段运行缓慢?哪些时间段?这些时间段内的盒子是什么样子的?

我会调查类似的事情穆宁。 它是非常简单的系统监控应用程序,用于收集数据并将其显示为图表。它们有适用于 Apache 和 MySQL 的插件,用于跟踪访问、进程和容量。

Munin 最大的优点是几乎无需付出任何努力就能获得大量信息。如果手动安装和设置,则只需 5 分钟,如果使用 Debian/Ubuntu,则只需 30 秒。将其放入后,您唯一需要做的就是在配置中添加主机条目,并确保启用了所需的插件。

Munin 或类似程序将帮助您了解系统当前的状况。当您开始更改、调整和调优应用程序时,这将非常有用,因为您将获得有关哪些程序运行良好的更好反馈。然后,您可以开始深入研究更具体的地方,并改善 MySQL 性能、Apache 性能以及机器上运行的其他任何程序。

相关内容