在回答这个问题之前,我从来没有开发出任何足以获得高服务器负载的东西.把我视为(感叹)一个刚刚降落在这个星球上的外星人,虽然他知道PHP和一些优化技术.
我正在开发一个PHP工具,可以获得相当多的用户,如果它正确的话.然而,虽然我完全有能力开发这个程序,但在制作可以处理巨大流量的东西方面,我几乎一无所知.所以这里有几个问题(随意将这个问题转化为资源线程).
目前我打算在PHP5中使用MySQLi功能.但是,我应该如何设置与用户和内容相关的数据库?我真的需要多个数据库吗?目前,所有内容都混杂在一个数据库中 - 尽管我一直在考虑将用户数据分散到一个数据库,将实际内容传播到另一个数据库,最后将核心网站内容(模板主人等)传播到另一个数据库.我的理由是,将查询发送到不同的数据库将减轻它们的负担,因为一个数据库= 3个负载源.如果它们都在同一台服务器上,它还会有效吗?
我有一个模板系统,用于构建页面和交换变量.主模板存储在数据库中,每次调用模板时,都会调用缓存副本(html文档).目前,我在这些模板中有两种类型的变量 - 静态变量和动态变量.静态变量通常是页面名称,站点名称 - 不经常更改的东西; 动态变量是每个页面加载时发生变化的事物.
我的问题是:
说我对不同的文章有评论.这是一个更好的解决方案:存储简单的评论模板,并呈现评论(从DB调用)每个页面加载时间或存储评论页面的缓存副本为HTML页面 - 每次添加注释时间/编辑/删除页面被记录下来.
有没有人有任何关于在PHP上运行高负载站点的提示/指针.我很确定这是一种可行的语言 - Facebook和Yahoo! 给它优先考虑 - 但是有什么经验值得我注意吗?
我有一个负载非常高的网站,并将我的测试应用程序保存在隐藏的iframe下,以确保目标框架是我的用例的一个不错的选择.首先尝试SignalR测试应用程序,然后在相同的服务器配置下Pokein.目前我们正在使用Flash远程处理解决方案,但很快我们计划对其进行更改.
我花了一些时间来制作基于SignalR的测试应用程序,以便在我网站的高负载下处理并发客户端更新.它在这种情况下运行良好(一些客户端请求消息)..当大多数连接的客户端同时请求消息时,它显着失败(我需要从iframe调用中删除它)..我我怀疑我的服务器配置是问题,但同样的情况工作在其他付费解决方案Pokein没有任何问题.
有没有我忘记的伎俩?
2012年2月10日更新: 虽然我们决定在我们的解决方案中实现PokeIn,但我在Github上尝试了最新的SignalR代码(可能对其他人有帮助)..结果是一样的.
March.13.2012更新: 场景:(再一次) - 尝试在给定的时间间隔内向成千上万个连接的客户端发送消息(1秒).测试和查看结果并不难.我觉得,我是唯一一个强调图书馆这种非常常见用法的人.
详细信息(如何重现 - 使用Github 0.5测试) - Server 2008 R2 32GB DDR3,i7-2600 3.4Ghz,2x256 GB Crucial M4 - ASP.NET 3.5
此页面嵌入到由多个网站加载的隐藏iframe中,以便进行真实的负载测试.
问题
系统在某些时候锁定(大约800个用户),并且大多数客户端没有从服务器获得更新的时间
一旦系统锁定,该单个应用程序页面就会停止响应
我也尝试将间隔增加到5秒.这次系统响应更快(约950名用户)但结果相同.我在.NET 2和.NET 4应用程序池上尝试过这个.
希望这些细节足够.重复这个测试对我来说很容易,一旦我找到空闲时间,我将在未来的版本中重复测试.
我要做的是在执行CPU密集型脚本之前更新一个简单的div来说"Processing ..."(运行需要3-12秒,没有AJAX)然后更新div来说"完成! " 完成后.
我所看到的是div永远不会更新"Processing ...".如果我在该命令后立即设置断点,则div文本会更新,所以我知道语法是正确的.IE9,FF6,Chrome13中的行为相同.
即使绕过jQuery并使用基本的原始Javascript,我也看到同样的问题.
你认为这会有一个简单的答案.但是,由于jQuery .html()和.text()没有回调挂钩,因此不是一个选项.它也没有动画,所以没有.queue可以操纵.
你可以使用下面我准备的示例代码来测试这个,它显示了具有5秒高CPU功能的jQuery和Javascript实现.代码很容易理解.单击按钮或链接时,您永远不会看到"正在处理..."
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" ></script>
<script type="text/javascript">
function addSecs(d, s) {return new Date(d.valueOf()+s*1000);}
function doRun() {
document.getElementById('msg').innerHTML = 'Processing JS...';
start = new Date();
end = addSecs(start,5);
do {start = new Date();} while (end-start > 0);
document.getElementById('msg').innerHTML = 'Finished JS';
}
$(function() {
$('button').click(function(){
$('div').text('Processing JQ...');
start = new Date();
end = addSecs(start,5);
do {start = new Date();} while (end-start > 0);
$('div').text('Finished JQ');
});
});
</script> …
Run Code Online (Sandbox Code Playgroud) 我有一个在 AWS 上运行的节点应用程序。当投入生产时,很有可能会收到大量请求。我计划使用 AWS ECS 托管它,并且应用程序前面会有一个 AWS 应用程序负载均衡器。当我查看“如何在生产中部署 Node 应用程序”时,我看到每个人都建议在 Node 应用程序前面使用 Nginx。
我的疑问是,如果我们的架构中有 ALB,我们还需要添加 Nginx 吗?如果我们需要为 100 万用户托管应用程序,那么使用 Nginx 有什么优势吗?
high-load nginx amazon-web-services aws-application-load-balancer
作为我研究的一部分,我正在用Java编写一个高负载的TCP/IP echo服务器.我想为大约3-4k的客户端提供服务,并且每秒可以看到我可以挤出的最大可能消息.消息大小非常小 - 最多100个字节.这项工作没有任何实际目的 - 只是一项研究.
根据我所见过的众多演讲(HornetQ基准测试,LMAX Disruptor会谈等),现实世界的高负载系统往往每秒服务数百万次交易(我相信Disruptor提到大约6密尔和大黄蜂 - 8.5).例如,这篇文章指出可以达到高达40M MPS.所以我把它作为现代硬件应该具备的粗略估计.
我编写了最简单的单线程NIO服务器并启动了负载测试.我很惊讶我在本地主机上只能获得大约10万MPS,在实际网络中只能获得25k MPS.数字看起来很小.我正在测试Win7 x64,核心i7.查看CPU负载 - 只有一个核心正忙(在单线程应用程序上预期),而其余核心处于空闲状态.然而,即使我加载所有8个核心(包括虚拟),我的MPS也不会超过800k - 甚至不到接近4千万:)
我的问题是:向客户提供大量消息的典型模式是什么?我应该在单个JVM内的几个不同套接字上分配网络负载,并使用某种负载均衡器(如HAProxy)将负载分配到多个内核吗?或者我应该考虑在我的NIO代码中使用多个选择器?或者甚至可能在多个JVM之间分配负载并使用Chronicle在它们之间建立进程间通信?在像CentOS这样适当的服务器端操作系统上进行测试会产生很大的不同(可能是Windows会减慢速度)吗?
下面是我的服务器的示例代码.对于任何传入的数据,它总是以"ok"回答.我知道在现实世界中,我需要跟踪消息的大小,并准备好一条消息可能在多次读取之间分配,但是我现在想让事情变得非常简单.
public class EchoServer {
private static final int BUFFER_SIZE = 1024;
private final static int DEFAULT_PORT = 9090;
// The buffer into which we'll read data when it's available
private ByteBuffer readBuffer = ByteBuffer.allocate(BUFFER_SIZE);
private InetAddress hostAddress = null;
private int port;
private Selector selector;
private long loopTime;
private long numMessages = 0;
public EchoServer() throws IOException { …
Run Code Online (Sandbox Code Playgroud) 我们有一个客户端服务器应用,1个服务器,大约10个客户端.它们使用自定义查询通过tcp套接字进行通信.
该系统运行平稳了好几个月,但在某些时候,在每日计划服务器FULL GC耗时约50秒后,我们发现客户端发送的查询与从服务器收到的响应之间的时间很长,> 10-20s.系统恢复3个小时后,一切都恢复正常.
在调查问题时,我们发现:
我们在服务器上进行了一次线程转储:
java.lang.Thread.State: RUNNABLE
at java.io.FilterInputStream.read(FilterInputStream.java:83)
at util.network.BytesBasedSocketConnection$ReadConnectionRunnable.run(BytesBasedSocketConnection.java:293)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
该FilterInputStream.read()
如下:
public int read() throws IOException {
return in.read();
}
Run Code Online (Sandbox Code Playgroud)
在in
我们的代码是一个BufferedInputStream
.
问题是:为什么大多数连接在完全GC暂停后放慢了?为什么stacktrace结束FilterInputStream.read()
?它不应该BufferedInputStream
在套接字输入流中的某个地方结束吗?这读取会导致服务器上的高负载吗?
我们用于阅读的代码:
int constructLength = _socketDIS.readInt();
ByteArrayOutputStream constructBOAS = new ByteArrayOutputStream(constructLength);
for (int i = 0; i != constructLength; i++) …
Run Code Online (Sandbox Code Playgroud) 我需要创建专门的HTTP服务器,为此我计划使用epoll sycall,但我想利用多个处理器/核心,我无法提出架构解决方案.ATM我的想法是跟随:用自己的epoll描述符创建多个线程,主线程接受连接并在线程epoll之间分配它们.但有更好的解决方案吗?我可以在高负载架构上阅读哪些书籍/文章/指南?我只看过C10K文章,但大多数链接到例子已经死了:(并且仍然没有关于这个主题的深入书籍:(.
谢谢你的回答.
UPD:请更具体,我需要材料和示例(nginx不是一个例子,因为它太复杂,并且有多个抽象层来支持多个系统).
我们有一个基于网络的游戏(SignalR用于通信),我们的工作量将是:
使用以下服务器是否有任何问题处理负载(假设信号器有80-90%的CPU)?
(通过长轮询我们可以很容易地做到@ 5-10%cpu)
我使用一个简单的redis服务器设置来存储我的PHP应用程序中的一些值.昨天我安装phpredis模块使用redis作为PHP Session后端,它将redis DB表单上的请求率提高到100到2000,并且DB大小从60Mb增加到200Mb.
在此之后,redis在每10个请求中都没有用处 - 只是没有响应.日志文件没有显示任何可以解释这一点的内容.
我有超过50%的内存空闲.以下是redis使用的资源:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
31075 root 20 0 170m 161m 936 S 41 2.0 11:10.52 redis-server
Run Code Online (Sandbox Code Playgroud)
这可能是什么原因?也许我应该调整一些redis设置以获得更高的负载?
这是我的redis.conf:
# Redis configuration file example
# Note on units: when memory size is needed, it is possible to specifiy
# it in the usual form of 1k 5GB 4M and so forth:
#
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 …
Run Code Online (Sandbox Code Playgroud) 我们有一个拥有32个内核的大型EC2实例,目前运行的是Nginx,Tornado和Redis,每秒平均提供5K请求.一切似乎都运行良好,但CPU负载已经达到70%,我们必须支持更多的请求.其中一个想法是用uWSGI取代Tornado,因为我们并没有真正使用Tornado的异步功能.
我们的应用程序由一个函数组成,它接收一个JSON(〜= 4KB),执行一些阻塞但非常快的东西(Redis)并返回JSON.
我们认为速度提升将来自uwsgi协议,我们可以在单独的服务器上安装Nginx,并使用uwsgi协议代理对uWSGI的所有请求.但在尝试所有可能的配置和更改操作系统参数后,即使在当前负载下,我们仍然无法使其工作.大多数时候nginx日志包含499和502错误.在某些配置中,它只是停止接收新的请求,例如它达到某些操作系统限制
正如我所说,我们有32个内核,60GB可用内存和非常快的网络.我们不做重物,只做非常快速的阻塞操作.在这种情况下,最好的策略是什么?进程,线程,异步?应该设置哪些OS参数?
目前的配置是:
[uwsgi]
master = 2
processes = 100
socket = /tmp/uwsgi.sock
wsgi-file = app.py
daemonize = /dev/null
pidfile = /tmp/uwsgi.pid
listen = 64000
stats = /tmp/stats.socket
cpu-affinity = 1
max-fd = 20000
memory-report = 1
gevent = 1000
thunder-lock = 1
threads = 100
post-buffering = 1
Run Code Online (Sandbox Code Playgroud)
Nginx配置:
user www-data;
worker_processes 10;
pid /run/nginx.pid;
events {
worker_connections 1024;
multi_accept on;
use epoll; …
Run Code Online (Sandbox Code Playgroud) high-load ×10
java ×2
nginx ×2
signalr ×2
.net ×1
architecture ×1
asp.net ×1
aws-application-load-balancer ×1
c ×1
c# ×1
dom ×1
epoll ×1
inputstream ×1
javascript ×1
jquery ×1
networking ×1
nio ×1
nosql ×1
performance ×1
php ×1
python ×1
redis ×1
sockets ×1
tcp ×1
tornado ×1
uwsgi ×1