在将到达率从10更改为100后,laodtest无法运行。
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
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
'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();
}发布于 2019-03-10 13:07:41
您的nodejs是运行火炮的实例,内存不足。其默认上限约为1.4G。
火炮,on *nix,可能是从/usr/bin/artillery开始的,当您用npm install -g安装它时。
文件的第一行很可能是,
#!/usr/bin/env node试着把它改成
#!/usr/bin/env node --max-old-space-size=8192以获得8G的堆空间。但是,不要占用比运行火炮的机器有更多的堆空间,否则你会崩溃的。读这个:如何增加nodejs的默认内存?
编辑:问题仍然存在:为什么您的artillery进程会抛出它的堆。看上去它在坠毁前跑了大约9s。这可能是,您的系统测试无法跟上您的负载,它的到达率为100。这可能是炮兵不断在内存中创建和排队,得到请求,而他们没有完成,所以他们没有得到释放。您的性能日志是否对此有任何提示?
负载测试的全部目的是找到被测试系统的断点。你不会通过把十个沙袋装进船来测试,然后说“酷它能用”,然后把100个沙袋倒进去。船就会沉下去。为什么要用这种方式测试服务器?你学到的就是它的容量在10到100之间。相反,增加负荷,沙袋的沙袋,直到系统开始绊倒。
这就是为什么火炮(实际上大多数负载测试系统)都有一种增加负荷的方式。
为什么不试试这样的方法:
- 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秒的测试通常不足以收集有价值的数据.你想知道你的系统在稳定的高负载下的容量。
https://stackoverflow.com/questions/55087652
复制相似问题