问题标签 [high-load]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
design-patterns - 数据库功能分解的模式?
我们有以下问题。我们的企业应用程序在 MySQL 中有一个数据库,它的结构似乎变得过于复杂 - 有 100 多个表(它已经开发了 7 年)。
但是,大多数表与任何其他表根本没有任何关系。有一些人人都使用的通用表(字典)(大约二十个这样的表),但仅此而已。问题出现了如何使这个数据库更快、更可靠。
我读了很多关于数据库分解的文章。也就是说,您将与不同域相关的表放在不同的数据库中。例如,与运单和其他纸质资料相关的任何内容都放在名为 Papers 的数据库中,与客户及其订单相关的任何内容都放在名为 Clients 的数据库中,等等。
这里我们有两个问题:
- 用户应该将企业应用程序视为作用于单个域。开发人员必须以某种方式更改使用数据库的核心,以便它可以处理多个数据库。
- 公用表产生了一个问题。它们必须保存在单个数据库中,并且分解后不能在所有数据库中复制。因此,我们如何进行查询 SELECT * FROM A JOIN B,其中 A 和 B 在不同的数据库中(在不同的服务器上)?
这两个问题实际上解决了同一个问题——是否有任何常见的企业模式(如 GoF)来解决这个问题?我对适合 Java EE 的模式特别感兴趣。
nosql - Redis 在高负载时定期停止响应
我正在使用一个简单的 redis 服务器设置在我的 PHP 应用程序中存储一些值。昨天我安装了 phpredis 模块以使用 redis 作为 PHP Session 后端,这将 redis DB 的请求率从 100 增加到 2000,并将 DB 大小从 60Mb 增加到 200Mb。
在此之后,redis 不是每 10 个请求都可用 - 只是没有响应。日志文件没有显示任何可以解释这一点的东西。
我有超过 50% 的可用内存。redis使用的资源如下:
这可能是什么原因?也许我应该调整一些 redis 设置以获得更高的负载?
这是我的 redis.conf:
linux - php-fpm 中的高 CPU 使用率
我们的 Web 项目有一个非常奇怪的问题。
我们用:
2 Intel(R) Xeon(R) CPU E5520 @ 2.27GHz
12 GB 内存
我们每秒大约有 20 次点击。每秒 4-5 个请求很重——这是一个搜索请求。
我们使用安装在另一台机器上的 nginx + php-fpm (5.3.22)
MySQL 服务器。
大多数时候,我们的平均负载低于 10,cpu 使用率约为 50%
有时我们的 cpu 使用率约为 95%,之后平均负载增长到 50 甚至更多!
您可以在此处查看平均负载和 CPU 使用率(我在此处发送图像的声誉很低)
负载平均
CPU 使用率
我们必须重新加载 php-fpm ( /etc/init.d/php-fpm reload) 以使情况正常化。
这可以每天发生 4-5 次。
我尝试使用 strace 来检查这种情况。
对不起,长日志!命令 strace -cp PID
PID 的输出是随机的 php-fpm 进程 ID(我们启动 100 个 php-fpm 进程)。
这两个导致高cpu使用率的时刻。
是的,输出脚本会读取很多信息。这个是正常的。
但是为什么 munmap 工作时间很长??!!当我们遇到问题时, munmap总是在顶部!
为了比较,这是在常规情况下跟踪随机 php-fpm 进程的结果:
你可以看到 munmap 不在顶部。
现在我们不知道如何解决这个问题:(
我们检查了下一个潜在问题,答案是“否”:
- 额外的用户活动
- 长脚本执行(几秒钟)
- 使用交换
你能帮助我们吗?
ios - 构建回合制多人游戏服务器
我开始制作多人游戏,但由于我没有经验,我尝试了不同的方法,但我觉得有些不对劲。所以,我真的需要一个关于我应该最好使用哪些平台/工具/语言/技术的建议。我必须说我不相信诸如:Photon、AppWrap、Skiller、Gamooga 等之类的东西。我不相信它们的规模会很大,也不会太贵,或者它们太大(我不是指尺寸,我是指它们有多少我不需要的东西)以满足我的需求。
首先,我将描述简化的游戏会话过程。
- 三名玩家开始游戏会话
- 每个玩家收到一个问题,并应在 10 秒内回答。
- 当玩家回答时,他应该能够看到任何其他玩家(如果有的话)已经给出的任何答案,并且他应该能够在给出答案后立即看到任何答案。基本上,其他客户应该实时收到任何答案,但只有在我们回答之后(以避免作弊)。如果时间到了,那么任何没有回答的人都不会得分,下一个问题会继续进行。
- 决定获胜者并进入下一个问题。N轮后完成游戏会话。
其次,我将解释我考虑的一些要求。
- 游戏应在 iOS/Android/Web 上运行。这让我别无选择,只能基于 HTTP。
- 我寻找我非常喜欢的 Google Cloud Endpoints。它有 iOS/Android/JS SDK,谷歌云平台有谷歌 BigQuery,还有很多其他很棒的东西。但是因为我需要实时回答传递,所以我不知道这是否合适(有 Channel API 但没有适用于 iOS 的客户端 SDK,人们说它不是那么好)。
- 然后我寻找 Node.js 和长轮询(客户端的 AFNetworking),但它很难管理。我需要向客户端提供游戏状态更新(并且我需要发送增量)。这样,我需要单独跟踪每个玩家的所有更改。当玩家连接时,我应该检查是否已经有任何变化;如果是则立即发送;如果不是,则侦听“更改”事件,然后发送。最后代码看起来很尴尬,很难理解,我不知道如何使它正确。有 socket.io 可以让服务器端的事情变得更好,但同样没有用于客户端的 iOS SDK。
我不知道从这里去哪里。任何帮助将不胜感激。
java - 高负载java服务器
我正在制作多人游戏。现在我正在尝试选择将 android 设备连接到服务器的技术。客户端运行安卓,游戏为MMORPG。我想用java编写服务器。现在我只有3个想法:
1) 使用纯 java 和套接字创建多线程环境。这样在游戏客户端和服务器之间进行全双工连接会更容易。但我有以下担忧:
1.1)该游戏是具有大量对象的MMORPG,如果有例如5000人同时玩,我不确定这些解决方案如何缩放。我可以在 java Machine 上运行多少个线程?我该如何近似计算?如果每个套接字有 1 个线程正在读取,而 1 个线程正在写入套接字(因此 1 个玩家有 2 个线程)。
1.2) 当玩家数量增加时,我将如何扩展我自己编写的 jar-archive 以分布在多个服务器上?也许有一些特殊的技巧可以做到这一点?
1.3) 大量的编程开销 - 套接字 API 非常低级。
2) 创建一个用于服务 HTTP 请求的 Servlet 接口。
2.1) 只要每个玩家都有自己的会话,就易于控制会话(和授权)。
2.2) 可以连接到 java EE EJB 或其他 - 消除了系统级编程的许多复杂性。所以我可以专注于编写业务逻辑。
2.3) 可以使用HTTP服务所有类型的客户端——移动设备+浏览器。
2.4) 高速——即使是 1 个 servlet 容器每秒也可以处理几千个请求,所以速度非常快。
2.4)但是这种方法不能提供全双工通信。我将不得不每 1 秒发送一次请求以检查更新。1 秒的延迟对游戏来说并没有太大的区别,因为它是回合制的,但它仍然会产生大量的流量。有很多玩家玩的时候可行吗?我听说过一些COMET技术,但是如果服务器必须连续推送许多消息,我仍然必须每次发送请求+该技术尚未成熟。
3) 创建套接字并通过 JMS 将它们连接到 java EE 服务器。
3.1)很酷,因为允许客户端和服务器之间的全双工通信+提供Java EE的所有很酷的功能。以后可以通过servlet接口扩展到浏览器。
3.2)这似乎是某种过度工程。人们真的会这样做吗?我的意思是它甚至是正确的方法吗?任何理智的开发人员会这样做吗?
我希望你帮我做出选择。我没有太多做这样的工作的经验。并希望坚持最佳做法。
java - Java 高负载 NIO TCP 服务器
作为我研究的一部分,我正在用 Java 编写一个高负载 TCP/IP 回显服务器。我想为大约 3-4k 的客户提供服务,并查看每秒可以从中挤出的最大可能消息。消息大小非常小 - 最多 100 个字节。这项工作没有任何实际目的——只是一项研究。
根据我看过的大量演示文稿(HornetQ 基准测试、LMAX Disruptor 演讲等),现实世界的高负载系统往往每秒处理数百万个事务(我相信 Disruptor 提到了大约 6 mils 和 Hornet - 8.5)。例如,这篇文章指出可以实现高达 40M MPS。所以我把它作为对现代硬件应该具备的能力的粗略估计。
我写了最简单的单线程 NIO 服务器并启动了负载测试。我对在 localhost 上只能获得大约 100k MPS 而在实际网络上只能获得 25k 感到惊讶。数字看起来很小。我在 Win7 x64,核心 i7 上进行测试。查看 CPU 负载 - 只有一个内核处于忙碌状态(这在单线程应用程序中是预期的),而其余内核处于空闲状态。但是,即使我加载了所有 8 个内核(包括虚拟内核),我的 MPS 也不会超过 800k - 甚至不会接近 4000 万 :)
我的问题是:向客户提供大量消息的典型模式是什么?我是否应该在单个 JVM 内的多个不同套接字上分配网络负载,并使用诸如 HAProxy 之类的负载平衡器将负载分配到多个内核?或者我应该考虑在我的 NIO 代码中使用多个选择器?或者甚至可以在多个 JVM 之间分配负载并使用 Chronicle 在它们之间建立进程间通信?在像 CentOS 这样的适当服务器端操作系统上进行测试会产生很大的不同吗(也许是 Windows 让事情变慢了)?
下面是我的服务器的示例代码。对于任何传入的数据,它总是回答“ok”。我知道在现实世界中我需要跟踪消息的大小并准备好一条消息可能会在多个读取之间拆分,但是我现在想让事情变得超级简单。
nosql - Cassandra 具有长 IN 运算符的慢速(rpc 超时)读取请求
我有下一个表结构:
用户 (uid) 喜欢 (True) 或不喜欢 (False) 内容 (cid)
“用户喜欢内容吗?”
如何使用 IN 加快读取请求?其他数据结构?有任何想法吗?
redis - 通过键列表选择值的方法?
例如,我有关键结构entity:product:[id]
,其中 id - 是一个整数[0-n]
所以我可以使用它keys entity:product:*
,但我不知道这个查询对 redis 服务器有多少负载。
另一种解决方案是
创建一个将存储实体 ID 的列表键:产品。
/li>然后(伪代码)
/li>
更好的方法是什么?什么会更快,什么会减少 redis 服务器的负载?
php - APC User-Cache 适合高负载环境吗?
我们尝试在高负载环境中部署 APC 用户缓存作为我们的中央缓存服务 (redis) 的每台服务器上的本地第二层缓存,用于缓存几乎不更改结果的数据库查询和配置。我们基本上看看 Facebook 做了什么(几年前):
http://www.slideshare.net/guoqing75/4069180-caching-performance-lessons-from-facebook http://www.slideshare.net/shire/php-tek-2007-apc-facebook
它在一段时间内运行良好,但在高负载下几个小时后,APC 遇到问题,因此整个 mod_php 不再执行任何 PHP。即使是一个简单的 PHP 脚本也不再响应,而静态资源仍然由 Apache 提供。它并没有真正崩溃,没有段错误。我们尝试了最新的稳定版和最新的 APC 测试版,我们尝试了 pthreads、自旋锁,每次都遇到同样的问题。我们为 APC 提供了它可以消耗的更多内存,在崩溃前 1 分钟,我们有 2% 的碎片,大约 90% 的内存是空闲的。当它“崩溃”时,我们在错误日志中找不到任何东西,只有重新启动 Apache 会有所帮助。只有使用自旋锁,我们才会得到一个 php 错误,即:
PHP致命错误:未知:在第0行的未知中检测到卡住的自旋锁(0x7fcbae9fe068)
这似乎是一种超时,pthread 不会发生这种情况,因为它们不使用超时。
发生的事情可能是这样的:http: //notmysock.org/blog/php/user-cache-timebomb.html
一些数字:服务器每秒有大约 400 个 APC 用户缓存命中和大约 30 次插入(我认为这是很多),一个请求有大约 20-100 个用户缓存请求。用户缓存中大约有 300.000 个变量,所有变量都带有 ttl(我们只在中央 redis 中存储不带 ttl 的变量)。
我们的 APC 设置是:
目前我们使用的是用自旋锁编译的 3.1.13-beta 版本,与旧的 PHP 5.2.6 一起使用(这是一个遗留应用程序,我听说这个 PHP 版本也可能有问题?),Linux 64 位。
调试起来真的很困难,我们编写了监控脚本,这些脚本每分钟从 apc、系统等处收集尽可能多的数据,但我们看不到任何异常情况——即使在崩溃前 1 分钟也是如此。
我在这里看到了很多类似的问题,但是到目前为止我们还没有找到解决我们问题的解决方案。当我读到这样的东西时:
http://webadvent.org/2010/share-and-enjoy-by-gopal-vijayaraghavan
我不确定将 APC 用于本地用户缓存是否是高负载环境中的最佳选择。我们已经在这里使用过 memcached,但是 APC 要快得多。但是如何让它稳定呢?
最好的问候,安德烈亚斯
php - 缓存失效导致高负载
假设我们的 php 脚本每秒有 10K 请求。
每个请求都在检查 memcached(或任何其他缓存存储)中的缓存。如果找到缓存 - 一切正常并返回缓存值。如果未找到缓存,我们将执行慢速 SQL 查询来填充缓存。它是最常见和最简单的缓存方案:
在我们没有太多请求之前,该方案运行良好。一旦我们有太多的请求,我们将面临大量请求在缓存中找不到任何东西并尝试重新填充它的情况。所以它们都将开始执行慢速 SQL 查询,这将导致高负载影响。解决办法是什么?
作为可能的解决方案,我看到以下情况:发现缓存无效的第一个请求应该创建一些触发器,说明缓存重新填充已经开始,另一个请求应该等待新的缓存或使用旧的(以前的)版本。
你如何解决类似的问题?