Артиллерия JavaScript куча нехватки памяти - PullRequest
0 голосов
/ 10 марта 2019

Laodtest не запускается после изменения скорости прибытия с 10 до 100.

Artillery: 1.6.0-27 Artillery Pro: not installed Node.js: v10.15.0 OS: darwin/x64
:test $ artillery run -o report.json artillery.yml
Started phase 0, duration: 10s @ 10:01:42(+0000) 2019-03-10
.
<--- Last few GCs --->

[62621:0x102803200] 9478 ms: Mark-sweep 1392.4 (1401.5) -> 1392.3 (1401.5) MB, 20.1 / 0.0 ms (average mu = 0.439, current mu = 0.002)

Запрошено последнее средство GC в старом пространстве [62621: 0x102803200] 9498 мс: развертка по метке 1392,3 (1401,5) -> 1392,3 (1401,5) МБ, 20,6 / 0,0 мс (среднее значение mu = 0,277, текущее значение mu = 0,001) в крайнем случае запрашивается GC в старом пространстве

<--- JS stacktrace --->

==== JS stack trace =========================================

0: ExitFrame [pc: 0x38a6205dbe3d]

Security context: 0x1da57481e6e1
1: byteLength [0x1da5274066f1] [buffer.js:526] [bytecode=0x1da597d26509 offset=126](this=0x1da5d7c5fbc1 <JSFunction

Буфер (sfi = 0x1da573a14251)>, строка = 0x1da597e082b9, кодировка = 0x1da5d92026f1) 2: кадр адаптера аргументов: 1-> 2 3: setContentLength (он же setContentLength) [0x1da5201841e9] [/Users//.nv...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
1: 0x10003b125 node::Abort() [/Users//.nvm/versions/node/v10.15.0/bin/node]
2: 0x10003b32f node::OnFatalError(char const*, char const*) [/Users//.nvm/versions/node/v10.15.0/bin/node]
3: 0x1001a8e85 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char

const *, bool) [/Users//.nvm/versions/node/v10.15.0/bin/node] 4: 0x1005742a2 v8 :: internal :: Heap :: FatalProcessOutOfMemory (char const *) [/Users//.nvm/versions/node/v10.15.0/bin/node] 5: 0x10057d7a4 v8 :: internal :: Heap :: AllocateRawWithRetryOrFail (int, v8 :: internal :: AllocationSpace, v8 :: internal :: AllocationAlignment) [/Users//.nvm/versions/node/v10.15.0/bin/node] 6: 0x10054f055 v8 :: internal :: Factory :: NewRawOneByteString (int, v8 :: internal :: PretenureFlag) [/Users//.nvm/versions/node/v10.15.0/bin/node] 7: 0x1006811a8 v8 :: internal :: String :: SlowFlatten (v8 :: internal :: Handlev8 :: internal :: ConsString, v8 :: внутренний :: PretenureFlag) [/Users//.nvm/versions/node/v10.15.0/bin/node] 8: 0x1001c6c1d v8 :: String :: Utf8Length () const [/Users//.nvm/versions/node/v10.15.0/bin/node] 9: 0x10004eaac node :: Buffer: :( анонимное пространство имен) :: ByteLengthUtf8 (v8 :: FunctionCallbackInfov8 :: Value const &) [/Users//.nvm/versions/node/v10.15.0/bin/node] 10: 0x10023170f v8 :: internal :: FunctionCallbackArguments :: Call (v8 :: internal :: CallHandlerInfo *) [/Users//.nvm/versions/node/v10.15.0/bin/node] 11: 0x100230c51 v8 :: internal :: MaybeHandlev8 :: internal :: Object v8 :: internal: :( анонимный Пространство имен) :: HandleApiCallHelper (v8 :: внутренний :: изолят *, v8 :: Внутренняя :: Handlev8 :: Внутренняя :: HeapObject, v8 :: Внутренняя :: Handlev8 :: Внутренняя :: HeapObject, v8 :: Внутренняя :: Handlev8 :: Внутренняя :: FunctionTemplateInfo, v8 :: Внутренняя :: Handlev8 :: :: внутренний объект, v8 :: внутренний :: BuiltinArguments) [/Users//.nvm/versions/node/v10.15.0/bin/node] 12: 0x1002302f0 v8 :: internal :: Builtin_Impl_HandleApiCall (v8 :: internal :: BuiltinArguments, v8 :: internal :: Isolate *) [/Users//.nvm/versions/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();
}

1 Ответ

0 голосов
/ 10 марта 2019

У вашего nodejs, экземпляра, запускающего артиллерию, недостаточно ОЗУ.Его ограничение по умолчанию составляет около 1,4 ГБ.

Артиллерия в * nix, вероятно, запускается с /usr/bin/artillery, когда вы устанавливаете ее с npm install -g.

Первая строка этого файла, скорее всего,

#!/usr/bin/env node

Попробуйте изменить это значение на

#!/usr/bin/env node  --max-old-space-size=8192

, чтобы получить пространство кучи в 8G.Но не берите больше места в куче, чем машина, на которой работает артиллерия, имеет физическую оперативную память, или вы будете уничтожены.Прочитайте это: как увеличить память по умолчанию для nodejs?

Редактировать : остается вопрос: почему ваш artillery процесс выдувает свойкуча.Похоже, он работал около 9 секунд, прежде чем он упал.Возможно, ваша тестируемая система не может справиться с нагрузкой, которую вы на нее возлагаете, с частотой поступления 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-секундный тест, как правило, недостаточно длинный, чтобы собрать полезные данные.Вы хотите знать емкость вашей системы при постоянной высокой нагрузке.

...