【问题标题】:PHP: is disk read/write lighter on the memory than SQL read/write? What is best strategy to minimize Memory use?PHP:磁盘读/写在内存上比 SQL 读/写轻吗?最小化内存使用的最佳策略是什么?
【发布时间】:2023-03-20 10:17:01
【问题描述】:

我的问题与速度无关,我希望尽量减少脚本的内存使用。有限共享托管资源上的 LAMP Web 应用程序(仅限 1GB 虚拟内存)。

  1. 应用程序在每次页面访问时从 mySQL 读取以从 sys_config 表和用户表加载(非常正常的操作)

我应该将配置加载到会话中吗?知道会话基本上是磁盘写入活动

这会减少内存使用吗? (重要的) 这会更快执行吗? (不太重要)

  1. 应用程序还在每次页面加载时写入 mySQL 以维护数据位(上次访问和少量微数据),这很重要,因为如果用户仍然在线,它可以让系统知道

我应该将此微数据写入文件吗? (如果以后需要,会定期将其保存到数据库中?)

这会减少内存使用吗? (重要的) 这会更快执行吗? (不太重要)

  1. 应用程序使用 AjAX,当用户在页面上时,它每隔 10 秒左右的时间间隔在后台加载 AJAX 数据。每个页面都有几组数据可以被处理并因此加载不同(即:联系人、在线用户、组)。我为每组数据分离了每个 http/ajax 请求,假设较小的请求块对于服务器来说会更容易/更轻松地处理,而不是一个 AJAX 请求一次提取和准备不同的数据集。

这是减少 php 内存使用的好策略吗?

【问题讨论】:

  • 注意Knowing sessions are basically disk writing activity sql 也是如此,所有数据库都是文件系统中的真实文件。
  • @JustOnUnderMillions 不是全部,例如mysql提供了一个存储引擎,它使用memory来存储数据;
  • @hassan 当然,你是对的,但默认情况下,所有 mysql 数据库都位于文件系统中。而MEMORY 是唯一使用内存的引擎。 :-)
  • memory use 这更多地取决于你做什么以及如何做。你喜欢SELECT * 还是只选择需要的东西。您是使用file() 将给定文件完全加载到内存中,还是使用fopen 并逐行读取。使用后你unset 的东西。您是使用 ajax 发送 html 还是仅发送在客户端呈现的纯数据。还有更多.....

标签: php ajax performance memory lamp


【解决方案1】:

会话数据完全存储在内存中,仅使用磁盘保存数据以供下次请求使用。您从 MySQL 读取的全部数据将首先存储在内存中。

PHP 和 MySQL 有自己的堆内存和 gabage 收集器,它为内部使用预先分配了相当大的内存量,因此将诸如上次访问时间戳之类的小块数据写入磁盘不会带来明显的改进。

出于同样的原因,使用小块请求会降低效率,因为 PHP 会为每个请求分配比实际需要更多的内存。所以更优化的块大小将在 1Gb/max_php_process_count 左右。换句话说,它应该尽可能大,以最大限度地提高内存使用效率。

无论如何,这个级别的所有优化都取决于您的 PHP 版本,最简单(可能也是最有效)的方法是使用交换。

【讨论】:

  • 嗯。我明白你的意思了..所以基本上最好将不同的数据集请求分组在一个大电话中,而不是打几个电话..会记下这一点。 bTW 我正在使用 PHP 版本 5.4.36 .. 较新的 PHP 版本更快吗?我实际上正在考虑交换,我问我的主机为什么不把多余的内存放在磁盘上使用它而不是终止,减速很好而不是终止。他们说不;(
【解决方案2】:

答案很大程度上取决于您的程序的目的。

无论你给它多少内存,MySQL 服务器都会使用它(通常是 64mb 或 128mb)。它使用该内存来优化您的请求。

在性能方面,对于简单的读/写,MySQL 比会话 (RAID 0 3xSSD) 慢约 500 倍。

一般来说,如果不需要保留任何持久性数据,请使用会话或 Redis。如果您关心存储用户数据,请使用数据库。数据库连接/请求根本不需要太多内存,并且可以确保您的数据保持完整。只要您不对数据本身进行任何搜索并使用索引来访问它,就可以将所有数据存储在数据库中。

您可以通过启用查询缓存(通常是不好的做法)使您的重复 AJAX 请求速度惊人地快。

总结: 对于性能/内存,将设置/数据永久存储在数据库中,但在用户登录时将值加载到会话中。每当您需要写入或检索信息时,请使用数据库。如果您想要速度惊人的快,请使用 Redis 或 memcached 并创建后台脚本,每隔几秒刷新一次存储在其中的数据,同时让用户仅从 memcached/Redis 获取数据。

【讨论】:

  • 一直在考虑缓存,甚至使用 couchdb 之类的东西,但这些东西似乎是为了提高速度。我更关注哪种方法的内存使用最少。如果我没记错的话,memcache 非常快,因为它将所有内容都保存在内存中 = 与我需要实现的目标相反 ==更少的 mem 使用。
  • @BrownChiLD Memcached 允许您设置它可以使用的最大内存量。通过牺牲 64MB RAM,您可以获得惊人的性能提升。对于所有数据库、缓存、Apache 和 PHP 脚本来说,1GB RAM 应该绰绰有余。在运行时很少有东西需要大量内存。如果您正在进行繁重的处理,则需要实现 Job Queue,并运行 2-3 个具有内存限制的工作人员来完成所有工作。但是对于其他几乎所有的事情,如果你使用 MySQL/Memcached,你应该不会有任何内存问题。
  • 感谢您的提示。不幸的是,1GB 的内存是不够的,它给我们带来了很大的痛苦.. 我们的 web 应用程序很小并且处理非常小的数据集(表数据库少于 500 行).. 随时查看我的其他帖子:stackoverflow.com/questions/42768234/…
  • 您可以考虑为您的工作实施流程管理器。但实际上,考虑到您的应用程序的平均消耗量,1GB 绝对不够。即使使用进程管理,您使用的平均内存也将大于 1GB。 (类似stackoverflow.com/questions/42512692/…
  • 我明白了.. tnx... 是的,我正在拉扯我的头发,试图弄清楚为什么我的应用程序吃掉了这么多内存。 tnx 寿
猜你喜欢
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2016-12-09
  • 2020-04-06
  • 2020-01-21
  • 2011-06-15
相关资源
最近更新 更多