标签: high-load

在高负载站点中使用PHP的策略

在回答这个问题之前,我从来没有开发出任何足以获得高服务器负载的东西.把我视为(感叹)一个刚刚降落在这个星球上的外星人,虽然他知道PHP和一些优化技术.


我正在开发一个PHP工具,可以获得相当多的用户,如果它正确的话.然而,虽然我完全有能力开发这个程序,但在制作可以处理巨大流量的东西方面,我几乎一无所知.所以这里有几个问题(随意将这个问题转化为资源线程).

数据库

目前我打算在PHP5中使用MySQLi功能.但是,我应该如何设置与用户和内容相关的数据库?我真的需要多个数据库吗?目前,所有内容都混杂在一个数据库中 - 尽管我一直在考虑将用户数据分散到一个数据库,将实际内容传播到另一个数据库,最后将核心网站内容(模板主人等)传播到另一个数据库.我的理由是,将查询发送到不同的数据库将减轻它们的负担,因为一个数据库= 3个负载源.如果它们都在同一台服务器上,它还会有效吗?

高速缓存

我有一个模板系统,用于构建页面和交换变量.主模板存储在数据库中,每次调用模板时,都会调用缓存副本(html文档).目前,我在这些模板中有两种类型的变量 - 静态变量和动态变量.静态变量通常是页面名称,站点名称 - 不经常更改的东西; 动态变量是每个页面加载时发生变化的事物.

我的问题是:

说我对不同的文章有评论.这是一个更好的解决方案:存储简单的评论模板,并呈现评论(从DB调用)每个页面加载时间或存储评论页面的缓存副本为HTML页面 - 每次添加注释时间/编辑/删除页面被记录下来.

最后

有没有人有任何关于在PHP上运行高负载站点的提示/指针.我很确定这是一种可行的语言 - Facebook和Yahoo! 给它优先考虑 - 但是有什么经验值得我注意吗?

php performance high-load

240
推荐指数
11
解决办法
2万
查看次数

SignalR在高负载下失败

我有一个负载非常高的网站,并将我的测试应用程序保存在隐藏的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应用程序池上尝试过这个.

希望这些细节足够.重复这个测试对我来说很容易,一旦我找到空闲时间,我将在未来的版本中重复测试.

.net c# asp.net high-load signalr

27
推荐指数
0
解决办法
5101
查看次数

jQuery/Javascript - 如何在继续执行函数之前等待被操作的DOM更新

我要做的是在执行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)

javascript jquery dom high-load

26
推荐指数
1
解决办法
2万
查看次数

如果我们为 Node 应用程序提供 AWS 应用程序负载均衡器,Nginx 是否会变得多余?

我有一个在 AWS 上运行的节点应用程序。当投入生产时,很有可能会收到大量请求。我计划使用 AWS ECS 托管它,并且应用程序前面会有一个 AWS 应用程序负载均衡器。当我查看“如何在生产中部署 Node 应用程序”时,我看到每个人都建议在 Node 应用程序前面使用 Nginx。

我的疑问是,如果我们的架构中有 ALB,我们还需要添加 Nginx 吗?如果我们需要为 100 万用户托管应用程序,那么使用 Nginx 有什么优势吗?

high-load nginx amazon-web-services aws-application-load-balancer

21
推荐指数
2
解决办法
9383
查看次数

Java高负载NIO TCP服务器

作为我研究的一部分,我正在用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)

java high-load nio tcp

18
推荐指数
2
解决办法
2万
查看次数

在Full GC之后导致套接字连接变慢的原因是什么?

我们有一个客户端服务器应用,1个服务器,大约10个客户端.它们使用自定义查询通过tcp套接字进行通信.

该系统运行平稳了好几个月,但在某些时候,在每日计划服务器FULL GC耗时约50秒后,我们发现客户端发送的查询与从服务器收到的响应之间的时间很长,> 10-20s.系统恢复3个小时后,一切都恢复正常.

在调查问题时,我们发现:

  1. 客户端和服务器上都没有垃圾回收问题
  2. 服务器上的查询处理时间很短.
  3. 服务器上的负载很高.
  4. 网络带宽未饱和.
  5. FULL GC期间未重置连接(每日FULL GC是正常事件,直到那时)
  6. 机器和操作系统最近从Centos 6(内核2.6.32)更改为Centos 7(内核3.10.0),但新配置已经过广泛测试.Oracle JDK版本也从1.7.65变为1.7.75.

我们在服务器上进行了一次线程转储:

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)

java sockets networking high-load inputstream

18
推荐指数
2
解决办法
1235
查看次数

C:epoll和多线程

我需要创建专门的HTTP服务器,为此我计划使用epoll sycall,但我想利用多个处理器/核心,我无法提出架构解决方案.ATM我的想法是跟随:用自己的epoll描述符创建多个线程,主线程接受连接并在线程epoll之间分配它们.但有更好的解决方案吗?我可以在高负载架构上阅读哪些书籍/文章/指南?我只看过C10K文章,但大多数链接到例子已经死了:(并且仍然没有关于这个主题的深入书籍:(.

谢谢你的回答.

UPD:请更具体,我需要材料和示例(nginx不是一个例子,因为它太复杂,并且有多个抽象层来支持多个系统).

c architecture high-load epoll

12
推荐指数
2
解决办法
1万
查看次数

SignalR性能

我们有一个基于网络的游戏(SignalR用于通信),我们的工作量将是:

  • 5,000 - 20,000并发客户端,0.5 - 2条消息/客户端/秒〜= 10-40k消息/秒

使用以下服务器是否有任何问题处理负载(假设信号器有80-90%的CPU)?

  • 双六角芯L5639(2.13Ghz)
  • 24G拉姆
  • Windows Server 2012标准

(通过长轮询我们可以很容易地做到@ 5-10%cpu)

high-load signalr

10
推荐指数
1
解决办法
7046
查看次数

Redis会在高负载时定期停止响应

我使用一个简单的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)

high-load nosql redis

9
推荐指数
1
解决办法
7832
查看次数

uWSGI python高负载配置

我们有一个拥有32个内核的大型EC2实例,目前运行的是Nginx,Tornado和Redis,每秒平均提供5K请求.一切似乎都运行良好,但CPU负载已经达到70%,我们必须支持更多的请求.其中一个想法是用uWSGI取代Tornado,因为我们并没有真正使用Tornado的异步功能.

我们的应用程序由一个函数组成,它接收一个JSON(〜= 4KB),执行一些阻塞但非常快的东西(Redis)并返回JSON.

  • 对其中一个Tornado实例(Nginx)的代理HTTP请求
  • 解析HTTP请求(Tornado)
  • 读取POST正文字符串(字符串化JSON)并将其转换为python字典(Tornado)
  • 从位于同一台机器上的Redis(阻塞)中取出数据(py-redis with hiredis)
  • 处理数据(python3.4)
  • 在同一台机器上更新Redis(py-redis with hiredis)
  • 为响应准备字符串化的JSON(python3.4)
  • 发送对代理的回复(Tornado)
  • 向客户发送回复(Nginx)

我们认为速度提升将来自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)

python high-load nginx tornado uwsgi

9
推荐指数
1
解决办法
6468
查看次数