diff --git a/.mapping.json b/.mapping.json index 418946b0e..2662c041c 100644 --- a/.mapping.json +++ b/.mapping.json @@ -257,6 +257,7 @@ "debian/source/format":"load/projects/pandora/debian/source/format", "docs/eng/architecture.md":"load/projects/pandora/docs/eng/architecture.md", "docs/eng/best-practices.md":"load/projects/pandora/docs/eng/best-practices.md", + "docs/eng/best_practices/discard-overflow.md":"load/projects/pandora/docs/eng/best_practices/discard-overflow.md", "docs/eng/best_practices/rps-per-instance.md":"load/projects/pandora/docs/eng/best_practices/rps-per-instance.md", "docs/eng/best_practices/shared-client.md":"load/projects/pandora/docs/eng/best_practices/shared-client.md", "docs/eng/config.md":"load/projects/pandora/docs/eng/config.md", @@ -286,6 +287,7 @@ "docs/rus/architecture.md":"load/projects/pandora/docs/rus/architecture.md", "docs/rus/best-practices.md":"load/projects/pandora/docs/rus/best-practices.md", "docs/rus/best_practices.md":"load/projects/pandora/docs/rus/best_practices.md", + "docs/rus/best_practices/discard-overflow.md":"load/projects/pandora/docs/rus/best_practices/discard-overflow.md", "docs/rus/best_practices/rps-per-instance.md":"load/projects/pandora/docs/rus/best_practices/rps-per-instance.md", "docs/rus/best_practices/shared-client.md":"load/projects/pandora/docs/rus/best_practices/shared-client.md", "docs/rus/config.md":"load/projects/pandora/docs/rus/config.md", diff --git a/cli/cli.go b/cli/cli.go index 40dee0285..a5c0cd01f 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -235,6 +235,15 @@ func readConfig(args []string) *CliConfig { log.Fatal("Config read failed", zap.Error(err)) } } + pools := v.Get("pools").([]any) + for i, pool := range pools { + poolMap := pool.(map[string]any) + if _, ok := poolMap["discard_overflow"]; !ok { + poolMap["discard_overflow"] = true + } + pools[i] = poolMap + } + v.Set("pools", pools) conf := DefaultConfig() err = config.DecodeAndValidate(v.AllSettings(), conf) diff --git a/docs/eng/best-practices.md b/docs/eng/best-practices.md index ae2721152..9063978ec 100644 --- a/docs/eng/best-practices.md +++ b/docs/eng/best-practices.md @@ -1,4 +1,5 @@ # Практики использования +- [Discard Overflow](best_practices/discard-overflow.md) - [RPS per instance](./best_practices/rps-per-instance.md) - [Shared client](best_practices/shared-client.md) \ No newline at end of file diff --git a/docs/eng/best_practices/discard-overflow.md b/docs/eng/best_practices/discard-overflow.md new file mode 100644 index 000000000..d57a1d2c0 --- /dev/null +++ b/docs/eng/best_practices/discard-overflow.md @@ -0,0 +1,48 @@ +[Home](../../index.md) + +--- + +# Discard Overflow + +When you specify a [load profile](../load-profile.md), the generator calculates the order and timing of requests. This +can be referred to as the schedule of requests execution. Pandora's scheduler is responsible for this. It receives +requests from the provider and according to this schedule, passes them to the instances. Each instance then executes the +requests sequentially. + +There may be situations where the scheduler believes it's time to execute the next request, but all instances are busy +waiting for their current requests to complete. In this case, the scheduler can proceed in one of two ways: + +1. Wait until an instance becomes available and then pass the request to it later than scheduled. +2. Discard this request and wait for the next one, anticipating that by the time the next request is due, one of the + instances will have become available. + +The instance setting `discard_overflow` determines which behavior to follow. + +1. `discard_overflow: false` - Flexible schedule adherence. The generator ensures that all planned requests are sent. + The test duration depends on the performance of the service being tested, average response time, and the number of + instances. +2. `discard_overflow: true` - Strict adherence to the request schedule by the generator. Requests that do not fit into + the schedule are discarded. The test duration is predetermined. Requests that fail to meet the schedule are marked as + failed (with a net error `777`, and also tagged as discarded). + +By default, starting from version pandora@0.5.24, the setting `discard_overflow: true` is enabled. + +## A Bit of Theory + +When might the situation arise that forces the scheduler to choose the `discard_overflow` behavior? As mentioned +earlier, this occurs when it's time to execute a request, but there are no free instances available to process it. Why +can this happen? This typically occurs when the server's response time is high and the combination of the number of +instances and the load profile is not optimally selected. This is when `V > N * 1/rps`, where: + +- `V` is the response time of the server being tested (in seconds). +- `N` is the number of instances. + +To avoid such situations, you can: + +- Increase the number of instances. +- Decrease the load profile. +- Optimize the server being tested to reduce response time. + +--- + +[Home](../../index.md) diff --git a/docs/eng/config.md b/docs/eng/config.md index 23007c302..ef5c5a69e 100644 --- a/docs/eng/config.md +++ b/docs/eng/config.md @@ -27,6 +27,7 @@ pools: destination: ./phout.log # report file name rps-per-instance: false # rps section is counted for each instance or for the whole test. false - for the whole test + discard_overflow: true # strict adherence to the request schedule rps: # shooting schedule type: line # linear growth diff --git a/docs/index.md b/docs/index.md index 4c08062f3..4a3a104a8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -12,11 +12,14 @@ write your own load scenarios in Go, compiling them just before your test. - [Instance startup profile](eng/startup.md) - [HTTP providers](eng/providers.md) - [HTTP generators](eng/http-generator.md) -- [Scenario generator / HTTP](eng/scenario-http-generator.md) - [gRPC generators](eng/grpc-generator.md) +- [Scenario generator / HTTP](eng/scenario-http-generator.md) - [Scenario generator / gRPC](eng/scenario-grpc-generator.md) - [Custom guns](eng/custom.md) - [Best practices](eng/best-practices.md) + - [Discard Overflow](eng/best_practices/discard-overflow.md) + - [RPS на инстанс](eng/best_practices/rps-per-instance.md) + - [Общий транспорт](eng/best_practices/shared-client.md) - [Pandora’s performance](eng/performance.md) - [Architectural overview](eng/architecture.md) diff --git a/docs/rus/best-practices.md b/docs/rus/best-practices.md index d4294e564..192d8422c 100644 --- a/docs/rus/best-practices.md +++ b/docs/rus/best-practices.md @@ -1,4 +1,5 @@ # Практики использования +- [Discard Overflow](best_practices/discard-overflow.md) - [RPS на инстанс](best_practices/rps-per-instance.md) - [Общий транспорт](best_practices/shared-client.md) \ No newline at end of file diff --git a/docs/rus/best_practices/discard-overflow.md b/docs/rus/best_practices/discard-overflow.md new file mode 100644 index 000000000..d95b856f1 --- /dev/null +++ b/docs/rus/best_practices/discard-overflow.md @@ -0,0 +1,47 @@ +[Домой](../index.md) + +--- + +# Discard overflow + +Когда вы указываете [профиль нагрузки](../load-profile.md) генератор рассчитывает порядок и время выполнения запросов. +Можно назвать это расписанием выполнения запросов. За это отвечает планировщик Пандоры. Он получает запросы от +провайдера и по этому рассписанию передает инстансам. А каждый инстанс выполняет запросы последовательно. + +Может возникнуть ситуация, когда планировщик считает, что наступило время выполнить следующий запрос, но все инстансы +заняты ожиданием выполнения своего текущего запроса. В этом случае планировщик может поступать одним из 2-х способов. + +1. Дождаться, когда освободится какой-либо инстанс и передать запрос ему позже расписания +2. Отбросить этот запрос и ожидать следующий, рассчитывая на то, что когда наступит время следующего запроса, уже + освободится один из инстансов. + +За то, какому поведению следовать, отвечает настройка инстанса `discard_overflow` + +1. `discard_overflow: false` - нестрогое следование расписанию. Генератор гарантирует, что все запланированные запросы + будут отправлены. Время выполнения теста зависит от производительности тестируемого сервиса, среднего времени ответа + и количества инстансов. +2. `discard_overflow: true` - строгое следование генератором расписания запросов. Запросы, не уложившиеся + в расписание, отбрасываются. Время выполнения теста предопределено. Запросы, которые не укладываются в расписание, + помечаются неудавшимися (ошибка net `777`, а так же добавляется tag:discarded). + +По-умолчанию, начиная с версии pandora@0.5.24 настройка `discard_overflow: true` + +## Немного теории + +Когда может возникнуть ситуация, в которой планировщику придется выбрать поведение discard_overflow? Как было сказано +выше, когда наступает время выполнения запроса, но нет свободных инстансов, которые этот запрос могут выполнить. +Почему это может происходить? Когда время ответа от сервера высоко и комбинация кол-во инстансов и профиль нагрузки +выбраны не оптимально. То есть когда `V > N * 1/rps`, где + +- `V` - время ответа нагружаемого сервера (в секундах) +- `N` - кол-во инстансов + +Таким образом, чтобы избежать такой ситуации можно + +- увеличить кол-во инстансов +- уменьшить профиль нагрузки +- оптимизировать нагружаемый сервис, для уменьшения времени ответа + +--- + +[Домой](../index.md) diff --git a/docs/rus/config.md b/docs/rus/config.md index 6fdb54c8f..7b9ad9c3f 100644 --- a/docs/rus/config.md +++ b/docs/rus/config.md @@ -27,6 +27,7 @@ pools: destination: ./phout.log # report file name rps-per-instance: false # секция rps считается для каждого инстанса или для всего теста. false - для всего теста + discard_overflow: true # строгое следование генератором расписания запросов rps: # планировщик нагрузки type: line # тип планировщика diff --git a/docs/rus/index.md b/docs/rus/index.md index d47e81d92..e81c931df 100644 --- a/docs/rus/index.md +++ b/docs/rus/index.md @@ -11,11 +11,14 @@ Pandora - это высокопроизводительный генератор - [Профиль создание инстансов](startup.md) - [HTTP providers](providers.md) - [HTTP генератор](http-generator.md) -- [Сценарный генератор / HTTP](scenario-http-generator.md) - [gRPC генератор](grpc-generator.md) +- [Сценарный генератор / HTTP](scenario-http-generator.md) - [Сценарный генератор / gRPC](scenario-grpc-generator.md) - [Custom](custom.md) - [Практики использования](best-practices.md) + - [Discard Overflow](best_practices/discard-overflow.md) + - [RPS на инстанс](best_practices/rps-per-instance.md) + - [Общий транспорт](best_practices/shared-client.md) - [Производительность Pandora](performance.md) - [Архитектура](architecture.md) diff --git a/tests/acceptance/testdata/http/http.yaml b/tests/acceptance/testdata/http/http.yaml index cf19068bc..a5b10f75a 100644 --- a/tests/acceptance/testdata/http/http.yaml +++ b/tests/acceptance/testdata/http/http.yaml @@ -1,5 +1,5 @@ pools: - - id: "" + - id: "http pool" ammo: file: testdata/http/payload.uri type: uri diff --git a/tests/acceptance/testdata/http/http2.yaml b/tests/acceptance/testdata/http/http2.yaml index 57fa0f00d..9d4bcfae0 100644 --- a/tests/acceptance/testdata/http/http2.yaml +++ b/tests/acceptance/testdata/http/http2.yaml @@ -1,5 +1,5 @@ pools: - - id: "" + - id: "http2 pool" ammo: file: testdata/http/payload.uri type: uri