我在 Apache 配置 8GB RAM 的 1and1.com 虚拟服务器上遇到了服务器过载问题。在选择时间内,一旦达到 100 多个活跃用户(根据 Google 分析),服务器就会变得非常慢。我已经进行了 siege 和 loadimpact 测试,并对 httpd.conf 文件进行了一些配置更改,但我不知道这是否足够。也许我只是需要更多的 RAM,比如 16GB,还是我缺少了什么?我知道我可以优化编程,但我不知道它如何能大幅提高性能。有趣的事实是,在这种过载期间,并行内存使用率仅显示 10-20%,但网站速度太慢了!救命!
Avg. site file size is 1.5MB (We have lots of pictures)
Avg. load time: 1.8s (during normal days) - 1,600 page views, 270 highest sessions p/h
这是服务器非常慢的一天的分析统计数据:
Highest sessions per hour: 420 - 700
Total sessions: 4,300 - 37,000
Page views: 25,300 - 361,500
Avg. Session duration: 9min
1and1 提供的服务器数据:
Webspace: 200GB
RAM: 8GB
Unlimited Traffic: yes
Operating System: CentOS 6 minimal system (64-bit)
cpu cores: 8
Processors: 4
Processor: AMD Opteron(tm) Processor 6378
Http.conf
Timeout 75
KeepAlive On
MaxKeepAliveRequests 500
KeepAliveTimeout 3
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 220
MaxClients 220
MaxRequestsPerChild 5000
</IfModule>
我的配置文件
max_allowed_packet = 1G
max_connections = 500
max_user_connections = 500
thread_cache_size = 500
query_cache_type = 1
query_cache_size = 128M
sort_buffer_size = 2M
tmp_table_size = 32M
read_buffer_size = 128k
read_rnd_buffer_size = 256k
join_buffer_size = 128k
table_definition_cache = 400
table_open_cache = 400
key_buffer_size = 500M
max_heap_table_size = 64M
innodb_buffer_pool_size = 500M
innodb_additional_mem_pool_size = 20M
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 12M
innodb_log_file_size = 256M
我做错了什么吗?非常感谢大家的帮助!
答案1
您需要考虑的第一件事是确定您的瓶颈在哪里。
- 系统的 CPU 是否被限制,或者是否有可用的 CPU,但是 Web 应用程序的进程没有有效地使用它(即,没有足够的工作线程)?
- 系统是否内存不足,或者正在进行大量交换?
- 您的数据库是否遇到了瓶颈?您的查询是否缓慢、需要索引,或者是否遇到了锁定问题?
- 观察应用程序请求的首字节时间,并将其与不触及应用程序代码的 Web 服务器的静态资源请求的时间进行比较 - 这将显示您的应用程序处理请求的速度。
一般来说,这些类型的性能问题都出现在应用程序中,而不是 Web 服务器配置中。
一旦了解了您的瓶颈,您可能能够在 Web 服务器软件的帮助下缓解它(具体方法取决于您正在运行的应用程序代码以及如何将其连接到 Web 服务器,但有很多关于如何从 FastCGI 或 中获得最佳性能的信息mod_passenger
),但您能做的事情非常有限。
总之:不要从 Web 服务器开始,而是从追踪您的瓶颈并修复它开始 - 如果您发现可以在 Web 服务器中做任何事情来帮助,那么尝试一下,但它不太可能能够解决您的应用程序的性能问题。