首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >炮兵JavaScript堆出内存

炮兵JavaScript堆出内存
EN

Stack Overflow用户
提问于 2019-03-10 12:25:06
回答 1查看 1.3K关注 0票数 0

在将到达率从10更改为100后,laodtest无法运行。

代码语言:javascript
复制
Artillery: 1.6.0-27 Artillery Pro: not installed Node.js: v10.15.0 OS: darwin/x64

测试$ -o report.json artillery.yml开始阶段0,持续时间: 10s @ 10:01:42(+0000) 2019-03-10。<-最后几个GCs >62621:0x1028032009478 ms:马克扫描1392.4 (1401.5) -> 1392.3 (1401.5) MB,20.1 /0.0ms(平均mu = 0.439,当前mu = 0.002) 旧空间中的最后一次GC请求为62621:0x1028032009498 ms: Mark-扫描1392.3 (1401.5) -> 1392.3 (1401.5) MB,20.6 /0.0ms(平均mu = 0.277,当前mu = 0.001) <-- JS堆栈跟踪-> ==== JS堆栈跟踪========================================= 0: ExitFrame pc: 0x38a6205dbe3d安全上下文: 0x1da57481e6e1 : byteLength 0x1da5274066f1 bytecode=0x1da597d26509 offset=126 2:参数适配器框架: 1->2 :setContentLength(又名setContentLength) 0x1da5201841e9/Users//..nv. 致命错误:内存中的CALL_AND_RETRY_LAST堆( 1: 0x10003b125 )::Abort()/Users//..nvm/ JavaScript /node/v10.15.0/bin/node 2: 0x10003b32f节点:OnFatalError( char const*,char const*) /Users//..nvm/version/node/v10.15.0/bin/node 3: 0x1001a8e85 CALL_AND_RETRY_LAST char / v8::internal::Heap::FatalProcessOutOfMemory(char /..nvm/ v8::internal::Heap::AllocateRawWithRetryOrFail(int,/node/v10.15.0/bin/node 4: 0x1005742a2V8::v8::internal::Factory::NewRawOneByteString(int,::AllocationAlignment/Users/..nvm/version/node/v10.15.0/bin/node 6: 0x10054f055 v8::internal::Factory::NewRawOneByteString(int,V8:internal:PretenureFlag)/User//..nvm/version/node/v10.15.0/bin/node 7: 0x1006811a8 v8::internal::String::SlowFlatten(v8::internal::Handlev8::internal::ConsString,V8::内部::PretenureF剂)/Users/..nvm/version/node/v10.15.0/bin/node 8: 0x1001c6c1d V8:String:String:Utf8Length() const /Users//..nvm/version/node/v10.15.0/bin/node 9: 0x10004#en0#节点::Buffer:(匿名namespace)::ByteLengthUtf8(v8::FunctionCallbackInfov8::Value const&) /Users/..nvm/version/node/v10.15.0/bin/节点10: 0x10023170f v8::internal::FunctionCallbackArguments::Call(v8::internal::CallHandlerInfo*) /..nvm/version/node/v10.15.0/bin/node 11: 0x100230c51 V8:Object::MaybeHandlev8::Object::ObjectV8:Object::(匿名namespace)::HandleApiCallHelper(v8::internal::Isolate*,)内部::Handlev8::内部::HeapObject,V8:internal::Handlev8:internal:HeapObject,v8::internal::Handlev8::internal::FunctionTemplateInfo,V8:internal::Handlev8::internal::Object,V8:internal:BuiltinArguments)/ v8::internal::Builtin_Impl_HandleApiCall(v8::internal::BuiltinArguments,//..nvm/v8::internal::Builtin_Impl_HandleApiCall(v8::internal::BuiltinArguments,/node/v10.15.0/bin/node 12: 0x1002302f0 v8::internal::Builtin_Impl_HandleApiCall(v8::internal::BuiltinArguments,V8::内部:隔离*)/用户//.nvm/version/node/v10.15.0/bin/node 13: 0x38a6205dbe3d中止陷阱:6

我的测试看起来是这样的。

.yml

代码语言:javascript
复制
config:
  target: "<URL_REMOVED"
  processor: "./getData.js"
  phases:
    - duration: 10
      arrivalRate: 100
scenarios:
  - flow:
      - function: "getData"
      - post:
          url: "/api/v2/auth"
          json:
            productId: "56729b6b77c82288f746c0cf"
          capture:
            json: "$.data.token"
            as: "token"
      - post:
          url: "/api/v2/sessions"
          headers:
            Authorization: 'Bearer {{token}}'
          json:
            productId: "56729b6b77c82288f746c0cf"
            jobId: "{{jobId}}"
          capture:
            json: "$.data.session._id"
            as: "sessionId"
      - post:
          url: "/api/v2/sessions/{{sessionId}}/document"
          headers:
            Authorization: "Bearer {{token}}"
          json:
            side: "front"
            payload: "{{frontDocument}}"
      - get:
          url: "/api/v2/sessions/{{sessionId}}/metrics/front"
          headers:
            Authorization: "Bearer {{token}}"
      - get:
          url: "/api/v2/sessions/{{sessionId}}/classification"
          headers:
            Authorization: "Bearer {{token}}"
      - get:
          url: "/api/v2/sessions/{{sessionId}}/end"
          headers:
            Authorization: "Bearer {{token}}"

getData.js

代码语言:javascript
复制
'use strict';
var faker = require('faker');
var FRONT_ID = require("./resources/id/front.json");

module.exports = {
    getData
};

function getData(userContext, events, done) {

    let jobId = faker.random.uuid()
    userContext.vars.jobId = jobId;
    userContext.vars.frontDocument = FRONT_ID.base64;
    return done();
}
EN

回答 1

Stack Overflow用户

发布于 2019-03-10 13:07:41

您的nodejs是运行火炮的实例,内存不足。其默认上限约为1.4G。

火炮,on *nix,可能是从/usr/bin/artillery开始的,当您用npm install -g安装它时。

文件的第一行很可能是,

代码语言:javascript
复制
#!/usr/bin/env node

试着把它改成

代码语言:javascript
复制
#!/usr/bin/env node  --max-old-space-size=8192

以获得8G的堆空间。但是,不要占用比运行火炮的机器有更多的堆空间,否则你会崩溃的。读这个:如何增加nodejs的默认内存?

编辑:问题仍然存在:为什么您的artillery进程会抛出它的堆。看上去它在坠毁前跑了大约9s。这可能是,您的系统测试无法跟上您的负载,它的到达率为100。这可能是炮兵不断在内存中创建和排队,得到请求,而他们没有完成,所以他们没有得到释放。您的性能日志是否对此有任何提示?

负载测试的全部目的是找到被测试系统的断点。你不会通过把十个沙袋装进船来测试,然后说“酷它能用”,然后把100个沙袋倒进去。船就会沉下去。为什么要用这种方式测试服务器?你学到的就是它的容量在10到100之间。相反,增加负荷,沙袋的沙袋,直到系统开始绊倒。

这就是为什么火炮(实际上大多数负载测试系统)都有一种增加负荷的方式。

为什么不试试这样的方法:

代码语言:javascript
复制
- duration: 120
  arrivalRate: 10
  name: "Two minutes, ten arrivals/sec"
- duration: 600
  arrivalRate: 10
  rampTo: 100
  name: "Ten minutes, gradual ramp to 100 arrivals/sec"

一旦您知道您的系统出现故障的到达率,您可以根据需要进行更详细的测试。而且,如果有必要,您可以尝试重做代码以使代码更快。

另外,10秒的测试通常不足以收集有价值的数据.你想知道你的系统在稳定的高负载下的容量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55087652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档