- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在平均响应时间为 的 Web 应用程序中实现并发限制器5 毫秒 .
我的实现基于“Performance Under Load ”, fork 项目 concurrency-limits并使用令人惊叹的技术演讲“Stop Rate Limiting! Capacity Management Done Right”中解释的概念。
我测量了我的应用程序在正常条件下的并发请求量(每秒正常请求量,正常响应时间),我得到以下结果:
1) 平均值为 1,7
2) Perc 95 是 3.2
3) 最大值(value)到达 45,50,60 取决于样本。
有了这些数字,我决定配置并发请求的最大容量 45 .在这一点上,我还没有问自己为什么最大值与平均值如此分离。
然后,我开始测试并发限制器,我发现一些请求最终由于达到阈值而被拒绝。 45 我配置的。
值得一提的是,我正在使用 AIMDLimit implementation为了即时修改最大容量。但是我也测量了每个值,并且最大容量的值永远不会小于 40。
所以,我对我的应用程序做了一些研究,我发现了以下内容。每次我的应用程序执行 Minor GC 或 Major GC(使用 CMS)时,N 的值都会增加很多。
测量值从 1、2 甚至 3 到 10、11、12,当执行完整的 GC 时,测量值甚至上升到 40、50、60(这是 N 高于我的阈值时的点,并且请求被拒绝)。
这种行为是有道理的,因为我的应用程序在 tomcat 容器后面,并且在执行 Minor 或 Major GC 时,tomcat 容器使用 SO 队列来轮询待处理的请求(参见“Tuning Tomcat For A High Throughput, Fail Fast System”),N 的值可以增加为好。
例如,让我们分析以下情况。
1) 应用程序正在处理 3 个并发请求
2) 执行需要 30ms 的 GC
3) 还有 10 个请求到达并保留在 SO 队列中,等待 tomcat 轮询它们
4)GC结束
5)10个请求被轮询,N(并发请求)的值现在上升到13
这里的问题是我还使用 jstat 测量了我的应用程序的 gc 时间,它们看起来并不那么糟糕:
+-----------+------+-------+-------+--------+-------+-------+------+---------+-----+--------+---------+
| Timestamp | S0 | S1 | E | O | M | CCS | YGC | YGCT | FGC | FGCT | GCT |
+-----------+------+-------+-------+--------+-------+-------+------+---------+-----+--------+---------+
| 91071.2 | 0.00 | 10.13 | 94.37 | 56.99 | 96.92 | 95.11 | 4399 | 368.077 | 64 | 22.428 | 390.505 |
| 91073.2 | 8.36 | 0.00 | 3.18 | 57.16 | 96.92 | 95.11 | 4400 | 368.178 | 64 | 22.428 | 390.606 |
| ******* | **** | **** | **** | ***** | ***** | ***** | **** | ******* | ** | ****** | ******* |
| ******* | **** | **** | **** | ***** | ***** | ***** | **** | ******* | ** | ****** | ******* |
| 91099.9 | 9.69 | 0.00 | 99.87 | 32.73 | 96.78 | 94.90 | 4386 | 318.084 | 66 | 19.694 | 337.778 |
| 91101.9 | 0.00 | 9.60 | 9.72 | 32.99 | 96.78 | 94.90 | 4387 | 318.135 | 66 | 19.694 | 337.830 |
| ******* | **** | **** | **** | ***** | ***** | ***** | **** | ******* | ** | ****** | ******* |
| ******* | **** | **** | **** | ***** | ***** | ***** | **** | ******* | ** | ****** | ******* |
+-----------+------+-------+-------+--------+-------+-------+------+---------+-----+--------+---------+
+-----------+------+------+-------+-------+--------+-------+-------+---------+-----+--------+---------+
| Timestamp | S0 | S1 | E | O | M | CCS | YGC | YGCT | FGC | FGCT | GCT |
+-----------+------+------+-------+-------+--------+-------+-------+---------+-----+--------+---------+
| ******* | **** | **** | **** | ***** | ***** | ***** | **** | ******* | ** | ****** | ******* |
| 91879.8 | 0.00 | 7.51 | 23.57 | 68.12 | 96.92 | 95.11 | 4437 | 372.348 | 65 | 22.432 | 394.780 |
| 91881.8 | 6.58 | 0.00 | 8.25 | 9.51 | 96.92 | 95.12 | 4438 | 372.465 | 66 | 23.066 | 395.531 |
+-----------+------+------+-------+-------+--------+-------+-------+---------+-----+--------+---------+
最佳答案
我的第一个想法是看看其他垃圾收集器,因为自 CMS 以来已经有了很多改进,但是你说你不想去探索...... ;-)
CMS 行为的各个方面都是可调的,可能会对您的情况有所帮助。一种是增量模式,您可以通过以下方式启用:-XX:+CMSIncrementalMode
.
来自 Concurrent Mark Sweep (CMS) Collector :
通常,CMS 收集器在整个并发跟踪阶段使用一个或多个处理器,不会主动放弃它们。类似地,一个处理器用于整个并发扫描阶段,同样不会放弃它。对于具有响应时间限制的应用程序来说,这种开销可能会造成太大的中断,否则这些应用程序可能会使用处理内核,尤其是在只有一个或两个处理器的系统上运行时。增量模式通过将并发阶段分解为短暂的 Activity 突发来解决这个问题,这些 Activity 计划在小暂停之间发生。
还有一些旋钮可以改变“占空比”(在上面链接的同一个文档中)可能会有所帮助 - 例如:-XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=10
– 但它们不太直接,您需要花一些时间进行测试和观察。
关于java - 当 GC 暂停持续时间超过平均响应时间时,如何限制 webapp 中的并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59311752/
我使用这个 cmd 应用程序 https://github.com/tokland/youtube-upload 上传 50 个视频后,我收到此错误: [RequestError] Server re
尝试将 docker 容器提交到镜像时出现错误: [root@dockerregistry /]# docker commit da4180ab1536 dockerregistry:5000/myi
我只是想知道这样做会更好吗: if((fd = open(filename, O_RDWR)) == -1) { fprintf(stderr, "open [ %s ]\n", strerror(e
我在我的开发机器(单个笔记本)中使用 Elasticsearch 1.4.4。一切都设置为默认值,因为我从未更改过任何设置。 当我启动它时,我通常会收到以下消息: [2015-10-27 09:38:
我收到错误 Lock wait timeout exceeded;尝试重新启动事务。这是什么原因,如何解决?仅供引用:MySQL 配置文件中的 innodb_lock_wait_timeout = 1
我对 Slack 中的 block 功能有疑问。有人设法构建 3 列而不是 2 列吗? 我凭直觉尝试了以下代码,但它不起作用: { "blocks": [ {
div 中的内容超过由 css 决定的固定大小。 #fixeddiv { position: fixed; margin: auto; max-height: 300px
我想将 EditText 字段限制为 150 个字符,我可以很容易地做到这一点。但是,当用户试图超过该限制时,我还需要通过键入(即第 151 个字符)或粘贴超过 150 个字符来提醒用户。 解决这个问
我目前正在使用此代码并排记录两个窗口: ffmpeg -f gdigrab -framerate 30 -i title="" -f gdigrab -framerate 30 -i title=""
我在几个包含长字符串的单元格上使用嵌套的 SUBSTITUE 函数,并定期更新 SUBSTITUE fx,这导致我将其复制并粘贴到所有需要它的单元格中。问题是,我的 SUBSTITUTE 列表会随着时
我创建了一个标题 div,如下所示:
Here is the demo link 您怎么看,页面中只有 8 个广告可见,但我有 14 个广告。我已阅读有关广告限制的信息 here但不明白是不是我的情况?有人可以给我确切的答案,为什么我看不
我的非常简单的算法 - C 中的快速排序有问题。它非常有效(随机化大约 0.1 秒并检查列表是否已排序)但是当我想要对超过 500k 的元素进行排序时它会崩溃。不幸的是,我需要对它们进行更多排序,因为
我成功解决了一个关于 Hackerrank 的问题,它通过了所有测试用例,但我得到了一个错误,超过了时间限制。我猜如果我优化我的代码它会工作,但我想不出任何方法来使我的代码更有效率。 问题是: 对大小
你会如何用 包围下面的文字3 个反引号 ```使用 tpope 的 Vim Surround . 我所能做的就是 1 个反引号 使用 S`在视觉模式下: 最佳答案 这不是你问的,但这可以在没有环绕的情
我目前有一个模拟账户。我正在尝试为我的雇主使用 SwifType 制作 POC。我们有一个非常大的数据库,每 1 小时索引一次,并创建一个 JSON 文件。我认为与 Elastic 的集成将非常容易,
我为一个大约有 100 到 120 名成员的小型组织维护网站。 每个月,我们都会发送一封电子邮件,通知我们的成员我们将在即将举行的 session 中讨论的主题。 我正在尝试使用我们的网站为我们提供一
这个问题已经有答案了: How to automatically input an array formula as string with more than 255 characters in l
我有一个在 JBoss 6.1 中运行的 JSF 应用程序,它使用内部Tomcat Servlet 容器。 我已经通过apache commons文件上传实现了上传。我想防止上传过大的文件并设置了属性
当我尝试在 PyMySQL 上执行查询时,出现以下错误: pymysql.err.InternalError: (1205, 'Lock wait timeout exceeded; try rest
我是一名优秀的程序员,十分优秀!