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),避免影响线上稳定性。