温馨提示×

ubuntu lamp内存占用优化

小樊
37
2025-12-26 01:26:49
栏目: 智能运维

Ubuntu LAMP 内存占用优化实操指南

一 基线评估与监控

  • 先摸清现状:用free -m查看可用内存与交换;用ps -eo pmem,pcpu,rss,vsize,args | sort -k1 -r | less按内存占用排序进程;用apache2ctl -M查看已加载模块;用top/htop持续观察内存与负载变化。
  • 基线记录:记录优化前后的空闲内存、Swap 使用、Apache/PHP-FPM/MySQL 常驻内存与每秒请求数,便于评估每项调整收益。

二 Apache 优化

  • 精简模块:只保留必要模块(如mod_dir、mod_log_config、mod_mime、mod_setenvif、mod_alias、mod_authz_host、mod_rewrite),用a2dismod禁用不需要的模块,变更后重载服务。
  • 降低日志开销:将LogLevel调为error,必要时减少User-Agent/Referer等记录以降低 I/O 与内存压力。
  • 选择更省内存的 MPM:
    • 低内存环境优先使用Event MPM(配合 PHP-FPM);若需使用线程化 MPM 运行 PHP,请采用PHP-FPM + mod_proxy_fcgi,避免传统Worker/Event + mod_php的线程安全问题。
    • 若必须使用Prefork(例如某些模块不兼容),务必严格控制并发进程数(见下条公式)。
  • 控制并发与 KeepAlive:
    • 估算 MaxRequestWorkers(Prefork):MaxRequestWorkers ≈ (可用内存 − 系统/MySQL/PHP 常驻) ÷ 单进程 RSS。示例:可用512MB、系统+MySQL+PHP 常驻约250MB、单进程 RSS 约40MB,则 MaxRequestWorkers 不宜超过**(512−250)/40 ≈ 6**。
    • KeepAlive 建议On,并限制MaxKeepAliveRequests(如100)与KeepAliveTimeout(如2–5 秒),在减少握手开销与占用之间取平衡。

三 MySQL MariaDB 优化

  • 控制总量与连接:将max_connections设小(如20–50),避免连接风暴导致内存膨胀;结合应用并发实测逐步微调。
  • 引擎取舍与缓存:
    • InnoDB为主时,设置innodb_buffer_pool_size为核心缓存;小内存(如1GB)可先从64M起步,视命中率与负载再上调。
    • MyISAM为主时,重点调key_buffer_size(索引缓存);MyISAM 数据块主要依赖操作系统页缓存,需给系统留出足够内存。
  • 会话级缓冲谨慎:诸如sort_buffer_size、read_buffer_size、read_rnd_buffer_size等为“每个连接”独占,设置过大在高并发下会迅速耗尽内存,保持默认或小幅上调即可。
  • 查询缓存:在MySQL 5.7及 MariaDB 新版本中,查询缓存在多数场景下收益有限且增加开销,建议query_cache_size=0、query_cache_type=0
  • 临时表上限:设置tmp_table_size / max_heap_table_size(如16M)避免大查询在内存中膨胀。

四 PHP 优化

  • 启用 OpCode 缓存:使用OPcache(PHP 5.5+ 内置)减少重复编译;可按需调整opcache.memory_consumption、opcache.interned_strings_buffer、opcache.max_accelerated_files等,既提速又降低 CPU 与内存抖动。
  • 合理设置内存上限:在php.ini中设置memory_limit(如128M起步,视应用而定);在PHP-FPM 池中可用**php_admin_value[memory_limit]**统一限制,防止个别脚本失控。
  • PHP-FPM 进程管理(适合 1GB 内存示例):
    • 采用dynamic模式,设置pm.max_children=5、pm.start_servers=2、pm.min_spare_servers=1、pm.max_spare_servers=2;结合单进程 RSS 与并发目标计算,避免超过可用内存。
  • 代码侧减负:及时unset不再使用的变量,避免一次性加载大数据集,尽量使用生成器/流式处理,减少内存峰值。

五 两层缓存与系统层面优化

  • 页面与对象缓存:在应用前加一层Varnish(反向代理/HTTP 加速器)缓存静态与可缓存的动态内容;对数据库热点数据使用Memcached/Redis降低查询压力与后端内存占用。
  • 传输与内容策略:启用mod_deflate(Gzip)压缩;用mod_expires为静态资源设置较长过期时间,减少重复请求与后端压力。
  • 系统参数与维护:适度降低vm.swappiness、必要时调整vm.overcommit_memory透明大页(THP)策略;仅在内核调优或测试需要时清理缓存(如写入/proc/sys/vm/drop_caches),避免影响线上稳定性。

0