在LNMP(Linux+Nginx+MySQL+PHP)环境中,内存泄漏可能来自以下几个组件:
使用以下命令监控系统内存使用情况:
free -h
top
htop
vmstat 1
# 查看各进程内存占用
ps aux --sort=-%mem | head
# 查看PHP-FPM进程内存
ps -ylC php-fpm --sort:rss
调整PHP-FPM配置
pm.max_children = 50 # 根据服务器内存调整
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500 # 处理指定数量请求后重启进程
检查PHP脚本
unset()
禁用可疑扩展
优化MySQL配置
[mysqld]
key_buffer_size = 16M
query_cache_size = 16M
tmp_table_size = 32M
max_heap_table_size = 32M
innodb_buffer_pool_size = 1G # 根据内存调整,通常为总内存的50-70%
监控MySQL内存使用
SHOW ENGINE INNODB STATUS;
SHOW STATUS LIKE 'Memory%';
优化Nginx配置
worker_processes auto;
worker_rlimit_nofile 100000;
events {
worker_connections 4000;
use epoll;
multi_accept on;
}
检查第三方模块
Valgrind (适用于C/C++扩展)
valgrind --leak-check=yes php your_script.php
PHP内存分析
// 在脚本中跟踪内存使用
echo memory_get_usage() . "\n";
echo memory_get_peak_usage() . "\n";
GDB调试 (高级用户)
gdb -p $(pidof php-fpm)
设置内存使用上限
; php.ini
memory_limit = 128M
使用OPcache减少PHP内存开销
[opcache]
opcache.enable=1
opcache.memory_consumption=128
通过以上方法,您应该能够诊断并解决LNMP环境中的大多数内存泄漏问题。对于复杂情况,可能需要更深入的专业分析。