由于预算限制,我使用 DigitalOcean 提供的最小 droplet,它正在为客户运行一个小型(4 或 5 个用户)旧版 php 应用程序,直到我可以为他们重写它。我刚刚安装了 redis,以尝试提高一些较昂贵的数据库查询的性能。我查看了底部列出的问题,并认为我仍然需要问这个问题。我不想在这个阶段进行“容量规划”。我只想根据下面引用的 redis 问题的公认答案,为 maxmemory 提出一个所谓的“<合理值>”,基于在 CentOS 6.9 上运行的 apache httpd 2.2.15、php 5.3.3 和 mysql 5.1.73 的典型需求(就像我说的,遗产)。
输出免费-h当没有人使用应用程序时
total used free shared buffers cached
Mem: 1.0G 809M 197M 368K 179M 484M
-/+ buffers/cache: 145M 860M
Swap: 0B 0B 0B
我担心的是/etc/php.inimemory_limit = 256M
我对输出config get maxmemory
感到震惊redis-cli,因为默认设置似乎不会打扰根本找出系统上实际可用的内容。
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "3221225472"
我的直觉告诉我,如果我天真地将 memory_limit 和 maxmemory 都设置为 98M,那么当应用程序以最大容量运行时,系统突然决定启动一些随机的管理进程,或者我需要进入 vi 来即时修复某些问题(我不会这样做),我将会遇到麻烦。曾经在生产机器上执行此操作)。嗯,我刚刚意识到我甚至没有考虑mysql的工作内存......请注意#551727讨论了调整策略,但实际上并没有回答有关应维护多少可用内存的问题。
研究的问题:
https://stackoverflow.com/questions/33115325/how-to-set-redis-max-memory
答案1
容量规划是不可避免的。正如您链接的答案所说,“视情况而定”。
保持足够的可用内存(也称为缓存,因为您不会有任何未使用的空闲内存)。“足够”意味着内存压力不会在尝试回收时严重减慢速度。最坏的情况是,OOM 杀手是个坏消息。
现在,要回答许多问题才能得出定量估计。考虑开始使用电子表格,有几个...
多少秒的响应时间是可接受的性能?从用户代理的角度来看,现在的请求速度有多快?
负载下的主机内存情况如何?记录所有/proc/meminfo
具有更具体小计的内存。
5 个用户是预期的最大数量吗?这是并发用户吗?也许你可以使用 5 个或更少的工作进程。
这个盒子上有 MySQL 吗?当所有参数加起来时,它的最大配置内存消耗是多少?最有可能来自innodb_buffer_pool_size
,也可能来自max_connections
✕ sort_buffer_size
。例如使用https://www.mysqlcalculator.com/ 和 https://launchpad.net/mysql-tuning-primer
httpd 是如何配置的?有多少个 worker?php 是 mod_php 还是 fpm?每个 httpd 进程的 RSS 典型值是多少,例如来自top
?
关于“更昂贵的数据库查询”。慢查询日志是什么样的?查询可以更高效吗?
关于添加缓存层。重复查询是否会从此类缓存中受益?您是否需要编写代码来利用缓存,或者它已经在应用程序中了?您的宝贵 MB 是否更适合花在 DB 缓冲区上?即使在最小大小的情况下,我仍然会预算几百 MB 来添加 Redis。