我在具有 8 核和 16G RAM 的虚拟服务器上运行 nginx+php-fpm+mysql。我的应用程序是一个简单的 API 提供程序服务器,它根据请求返回从 mysql 数据库生成的 JSON。数据集非常简单,只有几 kb 大。但是每秒有 1000k 个用户的高负载。简单的请求需要 10 秒!!!.. 这非常长。我猜是 MYSQL 导致响应缓慢。因为我有一个测试数据库 - 对测试数据库的相同请求需要 1sek。也许我需要调整我的 mysql 配置以加快请求速度?我正在使用 mysqli 和 bind 技术通过 php 生成输出,
这是我的配置:
/etc/nginx/nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes 8;
error_log /var/log/nginx/error.log;
#error_log /var/log/nginx/error.log notice;
#error_log /var/log/nginx/error.log info;
pid /var/run/nginx.pid;
events {
worker_connections 15000;
multi_accept on;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 100;
#gzip on;
# Load config files from the /etc/nginx/conf.d directory
# The default server is in conf.d/default.conf
include /etc/nginx/conf.d/*.conf;
}
/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used (fedora >= 15).
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
user=mysql
# Semisynchronous Replication
# http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html
# uncomment next line on MASTER
;plugin-load=rpl_semi_sync_master=semisync_master.so
# uncomment next line on SLAVE
;plugin-load=rpl_semi_sync_slave=semisync_slave.so
# Others options for Semisynchronous Replication
;rpl_semi_sync_master_enabled=1
;rpl_semi_sync_master_timeout=10
;rpl_semi_sync_slave_enabled=1
# http://dev.mysql.com/doc/refman/5.5/en/performance-schema.html
;performance_schema
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
答案1
最可能的原因是您的数据库查询和索引的使用不足。
您应该使用 MySQL 功能检查您的 SQL 查询EXPLAIN
,以便了解结果是如何产生的。
如果数据库索引没有什么可改进的,那么您需要考虑使用 PHP 或 Memcache 实现现成数据集的缓存。
答案2
我认为这是一个 I/O 问题。我通过在不同的目录中创建许多相同的 get.php 文件并将请求随机重定向到这些文件来解决这个问题。就像一个循环一样。它很好地改善了这种情况。
问候