Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / Программа для нагрузочного тестирования htttp сервисов / 20 сообщений из 20, страница 1 из 1
07.05.2019, 09:13
    #39810537
Valentin Kolesnikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
Недавно делал такую программу.

Может будет кому интересно.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
package com.github.http;

import com.github.underscore.lodash.U;
import java.io.File;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import org.HdrHistogram.AtomicHistogram;
import org.HdrHistogram.Histogram;
import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.toolchain.perf.HistogramSnapshot;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler;
import org.eclipse.jetty.util.thread.Scheduler;
import org.mortbay.jetty.load.generator.HTTP1ClientTransportBuilder;
import org.mortbay.jetty.load.generator.HTTPClientTransportBuilder;
import org.mortbay.jetty.load.generator.LoadGenerator;
import org.mortbay.jetty.load.generator.Resource;
import org.mortbay.jetty.load.generator.util.MonitoringThreadPoolExecutor;

public class HttpLoadGenerator {

    private final Scheduler scheduler = new ScheduledExecutorScheduler();

    private LoadGenerator.Builder prepareLoadGenerator(HTTPClientTransportBuilder clientTransportBuilder, String path) {
        HttpFields headers = new HttpFields();
        headers.put("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0");
        headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        headers.put("Accept-Language", "en-US,en;q=0.5");
        headers.put("Cookie", "__utma=124097164.2025215041.1465995519.1483973120.1485461487.58; __utmz=124097164.1480932641.29.9.utmcsr=localhost:8080|utmccn=(referral)|utmcmd=referral|utmcct=/; wp-settings-3=editor%3Dhtml%26wplink%3D1%26post_dfw%3Doff%26posts_list_mode%3Dlist; wp-settings-time-3=1483536385; wp-settings-time-4=1485794804; wp-settings-4=editor%3Dhtml; _ga=GA1.2.2025215041.1465995519; wordpress_google_apps_login=30a7b62f9ae5db1653367cafa3accacd; PHPSESSID=r8rr7hnl7kttpq40q7bkbcn5c2; ckon1703=sject1703_bfc34a0618c85; JCS_INENREF=; JCS_INENTIM=1489507850637; _gat=1");
        return new LoadGenerator.Builder()
                .threads(1)
                .port(80)
                .httpClientTransportBuilder(clientTransportBuilder)
                .resource(new Resource(path).requestHeaders(headers))
                .scheduler(scheduler);
    }

    public void startLoadTest(URL url, int resourceRate) throws Exception {
        MonitoringThreadPoolExecutor executor = new MonitoringThreadPoolExecutor(1024, 60, TimeUnit.SECONDS);

        Histogram treeHistogram = new AtomicHistogram(TimeUnit.MICROSECONDS.toNanos(1),
                TimeUnit.SECONDS.toNanos(10), 3);
        Histogram rootHistogram = new AtomicHistogram(TimeUnit.MICROSECONDS.toNanos(1),
                TimeUnit.SECONDS.toNanos(10), 3);

        LoadGenerator loadGenerator = prepareLoadGenerator(new HTTP1ClientTransportBuilder(), url.getPath())
                .warmupIterationsPerThread(0)
                .iterationsPerThread(10)
                .runFor(30, TimeUnit.SECONDS)
                .usersPerThread(100)
                .channelsPerUser(1)
                .resourceRate(resourceRate)
                .sslContextFactory(new SslContextFactory(true))
                .host(url.getHost())
                .port(url.getPort() == -1 ? 80 : url.getPort())
                .executor(executor)
                .resourceListener((Resource.TreeListener) info -> {
                    rootHistogram.recordValue(info.getResponseTime() - info.getRequestTime());
                    treeHistogram.recordValue(info.getTreeTime() - info.getRequestTime());
                })
                .build();
        AtomicLong responses = new AtomicLong();
        List<Long> requestsStatistic = new ArrayList<>();
        Runnable helloRunnable = () -> {
            long responsesForLastSecond = rootHistogram.getTotalCount() - responses.get();
            requestsStatistic.add(responsesForLastSecond);
            responses.set(rootHistogram.getTotalCount());
            double averageResponses = requestsStatistic.stream().mapToDouble(Double::valueOf)
                    .average().orElse(Double.NaN);
            System.err.printf("%s amount of responses for the last second: %d, avarege request rate: %.3f%n",
                    LocalDateTime.now().toString(),
                    responsesForLastSecond,
                    averageResponses);
        };

        ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1);
        scheduledExecutor.scheduleAtFixedRate(helloRunnable, 0, 1, TimeUnit.SECONDS);

        loadGenerator.begin().join();
        scheduledExecutor.shutdown();

        HistogramSnapshot rootSnapshot = new HistogramSnapshot(rootHistogram, 20, "root response time", "us", TimeUnit.NANOSECONDS::toMicros);
        System.err.println(rootSnapshot);
        System.err.printf("client thread pool - max_threads: %d, max_queue_size: %d, max_queue_latency: %dms%n%n",
                executor.getMaxActiveThreads(),
                executor.getMaxQueueSize(),
                TimeUnit.NANOSECONDS.toMillis(executor.getMaxQueueLatency())
        );

        executor.shutdown();
    }

    public static void main(String[] args) throws Exception {
        Options options = new Options();
        options.addOption("c", "config", true, "The config file.");
        options.addOption("?", "help", false, "This help text.");
        
        if (args.length > 0) {
            CommandLineParser parser = new BasicParser();
            CommandLine cmd;
            try {
                cmd = parser.parse(options, args);
            } catch (ParseException e) {
                help(options);
                return;
            }
            if (cmd.hasOption("?") || !cmd.hasOption("c")) {
                help(options);
                return;
            }
            String config = cmd.getOptionValue("c");
            if (new File(config).isFile()) {
                try {
                    final byte[] bytes = Files.readAllBytes(Paths.get(config, new String[0]));
                    String text = new String(bytes, StandardCharsets.UTF_8);
                    Map<String, Object> result = (Map<String, Object>) U.fromJson(text);
                    String url = (String) result.get("url");
                    Long requestRate = (Long) result.get("requestRate");
                    HttpLoadGenerator httpLoadGenerator = new HttpLoadGenerator();
                    httpLoadGenerator.startLoadTest(new URL(url), requestRate.intValue());
                } catch (Exception ex) {
                    System.out.println(config + " - " + ex.getMessage());
                }
            }
        } else {
            help(options);
        }
    }
        
    private static void help(Options options) {
        HelpFormatter formater = new HelpFormatter();
        formater.printHelp(100, "java -jar http-load-generator.jar", "", options, "");
    }
}



Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.github.javadev</groupId>
    <artifactId>http-load-generator</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>Http load generator</name>
    <description>The http load generator</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.github.http.HttpLoadGenerator</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/maven/**</exclude>
                                        <exclude>META-INF/COPYRIGHT.html</exclude>
                                        <exclude>META-INF/LICENSE*</exclude>
                                        <exclude>META-INF/NOTICE*</exclude>
                                        <exclude>META-INF/README.txt</exclude>
                                        <exclude>META-INF/DEPENDENCIES*</exclude>
                                        <exclude>LICENSE.txt</exclude>
                                        <exclude>rhinoDiff.txt</exclude>
                                        <exclude>license/**</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <dependencyReducedPomLocation>${project.build.directory}/dependency-reduced-pom.xml</dependencyReducedPomLocation>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.mortbay.jetty.loadgenerator</groupId>
            <artifactId>jetty-load-generator-client</artifactId>
            <version>1.0.0-BETA0</version>
        </dependency>
        <dependency>
            <groupId>commons-cli</groupId>
            <artifactId>commons-cli</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>com.github.javadev</groupId>
            <artifactId>underscore</artifactId>
            <version>1.42</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>





С уважением, Валентин
...
Рейтинг: 0 / 0
07.05.2019, 11:17
    #39810597
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
Имеет смысл нарисовать сравненение к примеру с JMeter и показать чем эта утилита лучше.
Проще там в настройке e.t.c. Кроме того в коде видно около десятка настроечных параметров
которые не вынесены в CLI. Почему?
...
Рейтинг: 0 / 0
07.05.2019, 14:19
    #39810679
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
Да кому нужен очередной клон ab/curl/wget/JMeter?

ИМХО что-то типа GPSS с возможностью фладить по попсовым сетевым протоколам был бы в сто раз интереснее
...
Рейтинг: 0 / 0
07.05.2019, 15:37
    #39810743
Valentin Kolesnikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
maytonИмеет смысл нарисовать сравненение к примеру с JMeter и показать чем эта утилита лучше.
Проще там в настройке e.t.c. Кроме того в коде видно около десятка настроечных параметров
которые не вынесены в CLI. Почему?

Есть ещё конфигурационный файл с 2-мя параметрами:

url - url для GET запросов
requestRate - число запросов в секунду.

С уважением, Валентин
...
Рейтинг: 0 / 0
07.05.2019, 15:41
    #39810747
Valentin Kolesnikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
dimonz80Да кому нужен очередной клон ab/curl/wget/JMeter?

ИМХО что-то типа GPSS с возможностью фладить по попсовым сетевым протоколам был бы в сто раз интереснее

Это ещё одна утилита для нагрузочного тестирования.

С уважением, Валентин
...
Рейтинг: 0 / 0
07.05.2019, 15:46
    #39810751
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
Valentin KolesnikovmaytonИмеет смысл нарисовать сравненение к примеру с JMeter и показать чем эта утилита лучше.
Проще там в настройке e.t.c. Кроме того в коде видно около десятка настроечных параметров
которые не вынесены в CLI. Почему?

Есть ещё конфигурационный файл с 2-мя параметрами:

url - url для GET запросов
requestRate - число запросов в секунду.

С уважением, Валентин
Ну... я до конца не понимаю суть этих параметров.
Код: java
1.
2.
3.
4.
5.
LoadGenerator loadGenerator = prepareLoadGenerator(new HTTP1ClientTransportBuilder(), url.getPath())
                .warmupIterationsPerThread(0)
                .iterationsPerThread(10)
                .runFor(30, TimeUnit.SECONDS)
                .usersPerThread(100)


однако хотелось-бы иметь возможноть ими управлять. Даже 30 секунд.... Это такая спорная цифра.
У кого-то база еще за 30 секунд не прогреется. Хорошую базу вообще можно 30 минут греть.
Ну вобщем... больше контроля.
...
Рейтинг: 0 / 0
07.05.2019, 16:19
    #39810777
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
Valentin Kolesnikovurl - url для GET запросов
requestRate - число запросов в секунду.а как быть с websocket?
...
Рейтинг: 0 / 0
07.05.2019, 18:16
    #39810855
Sergunka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
Я помнится сделал тул для моделирования работы сенсоров на разных устройствах. В качестве конфигурации взял простой json через рест.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
{
  "name": "SIM0_",
  "schedule":40,
  "frequency":1000,
  "start": false,
  "sensors":[{"sensor" : "Vibration",
               "method" : "spline",
               "x":[0.00, 10.0, 20.0, 30.0, 40.0],
               "y":[1.00, 2.0, 3.0, 2.0, 1.0]
              },
              {"sensor" : "Rotor_Speed",
               "method" : "spline",
               "x":[0.00, 10.0, 20.0, 30.0, 40.0],
               "y":[100.00, 200.0, 300.0, 200.0, 100.0]
              },
              {"sensor" : "Temperature",
               "method" : "line",
               "x":[0.00, 10.0, 20.0, 30.0, 40.0],
               "y":[10.00, 20.0, 30.0, 20.0, 10.0]
              }
    ]
}



https://vyatkins.wordpress.com/2016/07/30/velociraptor/

Все это крутится на томкете или Jetty довольно легко маштабируется по порту так как данные гонит через вебсокет. Расписание связи указано в секундах, а частота замеров в миллисекундах.
...
Рейтинг: 0 / 0
07.05.2019, 18:39
    #39810873
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
Valentin Kolesnikovdimonz80Да кому нужен очередной клон ab/curl/wget/JMeter?

ИМХО что-то типа GPSS с возможностью фладить по попсовым сетевым протоколам был бы в сто раз интереснее

Это ещё одна утилита для нагрузочного тестирования.

С уважением, Валентин

А Вы прежде чем свой вело утилиту писать, смотрели тот же JMeter например?
...
Рейтинг: 0 / 0
08.05.2019, 01:22
    #39810997
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
Valentin Kolesnikovdimonz80Да кому нужен очередной клон ab/curl/wget/JMeter?

ИМХО что-то типа GPSS с возможностью фладить по попсовым сетевым протоколам был бы в сто раз интереснее

Это ещё одна утилита для нагрузочного тестирования.

С уважением, Валентин


Бомбить запросами с максимально скоростью (или ограниченным rpm) - не нагрузочное тестирование. Было бы интереснее создать хотя-бы пуассоновский поток запросов. А совсем хорошо - возможность задавать различные характеристики потока запросов. Это ИМХО самое главное, чего не хватает упомянутому JMeter для того, чтобы сделать его серьезной тулзой для именно нагрузочного тестирования. Короче - нагрузочное тестирование без теории массового обслуживания - не нагрузочное, вот!
...
Рейтинг: 0 / 0
08.05.2019, 01:57
    #39811020
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
dimonz80Valentin Kolesnikovпропущено...


Это ещё одна утилита для нагрузочного тестирования.

С уважением, Валентин


Бомбить запросами с максимально скоростью (или ограниченным rpm) - не нагрузочное тестирование. Было бы интереснее создать хотя-бы пуассоновский поток запросов. А совсем хорошо - возможность задавать различные характеристики потока запросов. Это ИМХО самое главное, чего не хватает упомянутому JMeter для того, чтобы сделать его серьезной тулзой для именно нагрузочного тестирования. Короче - нагрузочное тестирование без теории массового обслуживания - не нагрузочное, вот!

Я идиот! В JMeter уже все есть
...
Рейтинг: 0 / 0
08.05.2019, 10:38
    #39811152
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
В любом случае приложение достойно внимания. Есть класс утилит которые работают из консоли
и ставят своей задачей быстро что-то протестировать. Или как можно скорее подтвердить негативный сценарий.
И будет ли распределение Пуассоном или не-пуассоном - не суть важно. Просто проверить что микросервис
падает уже на 10-й транзакции, запущеной в параллель.

Например безопасник может подёргать nmap для того чтобы проверить открытые порты на вашей рабочей станции.
Здесь утилита колесникова (будь она реализована как shell-скрипт и запускаема из /usr/bin) станет просто
инструментом быстрой проверки. Она не будет претендовать на лавры JMeter но время готовности к работе
- будет ее преимуществом. Кому это надо - решать пользователю.
...
Рейтинг: 0 / 0
08.05.2019, 11:57
    #39811202
qasta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
maytonВ любом случае приложение достойно внимания. Есть класс утилит которые работают из консоли
и ставят своей задачей быстро что-то протестировать.

Отчасти соглашусь, но лучше освоить JMeter. И проверок там больше можно сделать, и нагрузку создать тоже проще ("нормальную" нагрузку часто надо создавать из распределенной сети - хотя бы с нескольких компьютеров).

Протестировать обычный GET - в JMeter собирается за минут 5-10 (параллельно попивая кофе и читая новости).
...
Рейтинг: 0 / 0
08.05.2019, 12:06
    #39811207
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
5-10 минут - это невыносимо долго. Согласись.
...
Рейтинг: 0 / 0
08.05.2019, 13:13
    #39811250
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
mayton5-10 минут - это невыносимо долго. Согласись.
да это ваще пипец. быстрее 10 строчек кода написать с Executors.newFixedThreadPool и http-клиентом
...
Рейтинг: 0 / 0
08.05.2019, 14:10
    #39811312
qasta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
mayton5-10 минут - это невыносимо долго. Согласись.

Согласен :)
...
Рейтинг: 0 / 0
08.05.2019, 20:44
    #39811546
Sergunka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
dimonz80Было бы интереснее создать хотя-бы пуассоновский поток запросов.

К слову сказать как Вы его создаете когда надо?

P.S. К слову сказать на хабре обнаружил статью где боле менее объясняется история вопроса
https://habr.com/ru/company/yandex/blog/431650/
...
Рейтинг: 0 / 0
09.05.2019, 01:46
    #39811603
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
Sergunkadimonz80Было бы интереснее создать хотя-бы пуассоновский поток запросов.

К слову сказать как Вы его создаете когда надо?



Задать время между запросами как случайную величину с экспоненциальной плотность распределения вероятностей
...
Рейтинг: 0 / 0
09.05.2019, 02:40
    #39811605
Sergunka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
dimonz80Sergunkaпропущено...


К слову сказать как Вы его создаете когда надо?



Задать время между запросами как случайную величину с экспоненциальной плотность распределения вероятностей

Ну, это понятно из учебника, код когда нибудь писали? Интересно было бы взглянуть... ну или объясните на пальцах

Из моего опыта там серьезный момент когда сервис занят, что происходит как долго запрос "висит" в очереди?
...
Рейтинг: 0 / 0
09.05.2019, 03:54
    #39811607
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа для нагрузочного тестирования htttp сервисов
Sergunkadimonz80пропущено...


Задать время между запросами как случайную величину с экспоненциальной плотность распределения вероятностей

Ну, это понятно из учебника, код когда нибудь писали? Интересно было бы взглянуть... ну или объясните на пальцах


Код писал для диплома много лет назад, сейчас не найду уже. Только там нагрузка эмулировалась на уровне отдельных пакетов.
Чтобы получить функцию задержки между запросами, надо взять функцию, обратную ПРВ, от равномерно-распределенной случайной величины (обычный rand()). Как-то так, если мне склироз не изменяет


Почитать по теме можно вот такое
Б.С.Лившиц, А.П.Пшеничников, А.Д.Харкевич Теория Телетрафика, гл 7
В. Столлингс Современные Компьютерные сети, гл. 7-9


Из моего опыта там серьезный момент когда сервис занят, что происходит как долго запрос "висит" в очереди?


Дык моделирование для того и нужно, чтобы ответить на вопрос "а с какой вероятностью и временем ожидания будет обслужен запрос, когда на входе поток в 100500 rps, а очередь только на 10 запросов?"
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Программа для нагрузочного тестирования htttp сервисов / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]