Laradock - 请求需要花费大量时间来回答并且使用率很高 CPU
Laradock - Requests are taking a lot of time to answer and using high CPU usage
当代码中存在错误时,我很难调试我的 Laravel 应用程序。
假设我有路线:
Route::get('/test', function () {
return 'it_works';
});
一切正常。但是,如果我在代码中添加这样的错误:
Route::get('/test', function () {
return 'all_good' . $not_declared_variable; //Obviously a bug, variable doesn't exist
});
当出现错误时,CPU 使用率超过 100%(在 PHP-FPM 上)。 nginx 需要几分钟才能在日志中写一些东西,这个问题中的这个简单帖子需要 15-45 秒才能在日志中有一个条目说变量 $not_declared_variable
没有声明。再加上 CPU 使用率如此之高,以至于如果我连续发出 3-5 个请求,我的笔记本电脑就会死机。我有一个带有 256GB SSD 和 16GB RAM 的 i5,所以我不认为我的笔记本电脑配置是这里的问题。
我在某些控制器中发生了一些深层逻辑,等待 3-5 分钟直到我在日志中获得一些条目以了解发生了什么是非常烦人的。
感觉是 PHP-FPM 或 NGINX 中的一些错误配置是原因。这是我的 nginx 配置文件:
server {
listen 80;
listen [::]:80;
server_name admin-control.test;
root /var/www/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 600;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt/;
log_not_found off;
}
error_log /var/log/nginx/admin_error.log;
access_log /var/log/nginx/admin_access.log;
}
我在 php.ini:
中启用了 opcache
[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
我是不是漏掉了什么?提前谢谢大家
编辑(1):
我确定了 PHP-FPM 进程的 PID 和 运行 strace -ffttTo
以查看发生了什么,我得到了以下数千行:
18:07:15.810151 mremap(0x7f3a79b5f000, 1556750336, 1556754432, MREMAP_MAYMOVE) = 0x7f3d6db5d000 <0.005863>
18:07:15.816138 mremap(0x7f3d6db5d000, 1556754432, 1556758528, MREMAP_MAYMOVE) = 0x7f3a79b5d000 <0.000243>
18:07:15.816512 mremap(0x7f3a79b5d000, 1556758528, 1556762624, MREMAP_MAYMOVE) = 0x7f3d6db5b000 <0.005760>
18:07:15.822443 mremap(0x7f3d6db5b000, 1556762624, 1556766720, MREMAP_MAYMOVE) = 0x7f3a79b5b000 <0.000273>
18:07:15.822863 mremap(0x7f3a79b5b000, 1556766720, 1556770816, MREMAP_MAYMOVE) = 0x7f3d6db59000 <0.007095>
18:07:15.830289 mremap(0x7f3d6db59000, 1556770816, 1556774912, MREMAP_MAYMOVE) = 0x7f3a79b59000 <0.000264>
18:07:15.830704 mremap(0x7f3a79b59000, 1556774912, 1556779008, MREMAP_MAYMOVE) = 0x7f3d6db57000 <0.005861>
18:07:15.836794 mremap(0x7f3d6db57000, 1556779008, 1556783104, MREMAP_MAYMOVE) = 0x7f3a79b57000 <0.000319>
18:07:15.837250 mremap(0x7f3a79b57000, 1556783104, 1556787200, MREMAP_MAYMOVE) = 0x7f3d6db55000 <0.006262>
18:07:15.843705 mremap(0x7f3d6db55000, 1556787200, 1556791296, MREMAP_MAYMOVE) = 0x7f3a79b55000 <0.000304>
对于那些后来来到这里的人,我设法解决了我的问题。这是 php-fpm/xdebug.ini
中的一些配置错误(我仍然无法在我的 Linux 中使 XDebug 与 Laradock 一起工作)。
我已经尝试了很多配置来启用 XDebug,但我失败得很惨。这是我现在的配置,它不工作但至少我不再有高 CPU 使用问题:
xdebug.mode=debug
xdebug.remote_host=192.168.0.16
xdebug.remote_connect_back=0
xdebug.remote_port=9001
xdebug.idekey=PHPSTORM
xdebug.remote_autostart=0
xdebug.remote_enable=1
xdebug.cli_color=0
xdebug.profiler_enable=0
xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"
xdebug.remote_log="/var/log/xdebug.log"
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.max_nesting_level=250
xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1
将继续尝试解决 Xdebug 问题,但不会 post 这里有任何问题,因为这是一个不同的问题...
当代码中存在错误时,我很难调试我的 Laravel 应用程序。 假设我有路线:
Route::get('/test', function () {
return 'it_works';
});
一切正常。但是,如果我在代码中添加这样的错误:
Route::get('/test', function () {
return 'all_good' . $not_declared_variable; //Obviously a bug, variable doesn't exist
});
当出现错误时,CPU 使用率超过 100%(在 PHP-FPM 上)。 nginx 需要几分钟才能在日志中写一些东西,这个问题中的这个简单帖子需要 15-45 秒才能在日志中有一个条目说变量 $not_declared_variable
没有声明。再加上 CPU 使用率如此之高,以至于如果我连续发出 3-5 个请求,我的笔记本电脑就会死机。我有一个带有 256GB SSD 和 16GB RAM 的 i5,所以我不认为我的笔记本电脑配置是这里的问题。
我在某些控制器中发生了一些深层逻辑,等待 3-5 分钟直到我在日志中获得一些条目以了解发生了什么是非常烦人的。
感觉是 PHP-FPM 或 NGINX 中的一些错误配置是原因。这是我的 nginx 配置文件:
server {
listen 80;
listen [::]:80;
server_name admin-control.test;
root /var/www/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 600;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt/;
log_not_found off;
}
error_log /var/log/nginx/admin_error.log;
access_log /var/log/nginx/admin_access.log;
}
我在 php.ini:
中启用了 opcache[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
我是不是漏掉了什么?提前谢谢大家
编辑(1):
我确定了 PHP-FPM 进程的 PID 和 运行 strace -ffttTo
以查看发生了什么,我得到了以下数千行:
18:07:15.810151 mremap(0x7f3a79b5f000, 1556750336, 1556754432, MREMAP_MAYMOVE) = 0x7f3d6db5d000 <0.005863>
18:07:15.816138 mremap(0x7f3d6db5d000, 1556754432, 1556758528, MREMAP_MAYMOVE) = 0x7f3a79b5d000 <0.000243>
18:07:15.816512 mremap(0x7f3a79b5d000, 1556758528, 1556762624, MREMAP_MAYMOVE) = 0x7f3d6db5b000 <0.005760>
18:07:15.822443 mremap(0x7f3d6db5b000, 1556762624, 1556766720, MREMAP_MAYMOVE) = 0x7f3a79b5b000 <0.000273>
18:07:15.822863 mremap(0x7f3a79b5b000, 1556766720, 1556770816, MREMAP_MAYMOVE) = 0x7f3d6db59000 <0.007095>
18:07:15.830289 mremap(0x7f3d6db59000, 1556770816, 1556774912, MREMAP_MAYMOVE) = 0x7f3a79b59000 <0.000264>
18:07:15.830704 mremap(0x7f3a79b59000, 1556774912, 1556779008, MREMAP_MAYMOVE) = 0x7f3d6db57000 <0.005861>
18:07:15.836794 mremap(0x7f3d6db57000, 1556779008, 1556783104, MREMAP_MAYMOVE) = 0x7f3a79b57000 <0.000319>
18:07:15.837250 mremap(0x7f3a79b57000, 1556783104, 1556787200, MREMAP_MAYMOVE) = 0x7f3d6db55000 <0.006262>
18:07:15.843705 mremap(0x7f3d6db55000, 1556787200, 1556791296, MREMAP_MAYMOVE) = 0x7f3a79b55000 <0.000304>
对于那些后来来到这里的人,我设法解决了我的问题。这是 php-fpm/xdebug.ini
中的一些配置错误(我仍然无法在我的 Linux 中使 XDebug 与 Laradock 一起工作)。
我已经尝试了很多配置来启用 XDebug,但我失败得很惨。这是我现在的配置,它不工作但至少我不再有高 CPU 使用问题:
xdebug.mode=debug
xdebug.remote_host=192.168.0.16
xdebug.remote_connect_back=0
xdebug.remote_port=9001
xdebug.idekey=PHPSTORM
xdebug.remote_autostart=0
xdebug.remote_enable=1
xdebug.cli_color=0
xdebug.profiler_enable=0
xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"
xdebug.remote_log="/var/log/xdebug.log"
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.max_nesting_level=250
xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1
将继续尝试解决 Xdebug 问题,但不会 post 这里有任何问题,因为这是一个不同的问题...