Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Свистухин Андрей, ИТМО DWS, Stage 5 #186

Merged
merged 58 commits into from
May 14, 2024

Conversation

stormrvge
Copy link
Contributor

No description provided.

Copy link

@codeclimate codeclimate bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR diff size of 5337 lines exceeds the maximum allowed for the inline comments feature.

Copy link

@codeclimate codeclimate bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR diff size of 13162 lines exceeds the maximum allowed for the inline comments feature.

Copy link

@codeclimate codeclimate bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR diff size of 13169 lines exceeds the maximum allowed for the inline comments feature.

Copy link

@codeclimate codeclimate bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR diff size of 13313 lines exceeds the maximum allowed for the inline comments feature.

@stormrvge
Copy link
Contributor Author

Проблему с аллокациями пофиксил в следующей лабораторной. Если нужно, могу изменения подлить сюда.

Copy link

@codeclimate codeclimate bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR diff size of 8197 lines exceeds the maximum allowed for the inline comments feature.

Copy link

@codeclimate codeclimate bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR diff size of 8198 lines exceeds the maximum allowed for the inline comments feature.

Request request,
List<String> nodeUrls,
int ack,
List<CompletableFuture<Response>> futures,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Очень плохой паттерн: передавать в параметрах IN и OUT переменные. Лучше стараться так организовать код, чтобы в пармтерах были только IN, а OUT было в return.
И лучше чтобы это было что-то одно

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нужно было эти futures возвращать return'ом и дальше записывать их в структуру которая лежит по стеку вызовов выше? Я просто подумал, что может быть из-за этого у меня и сходил с ума GC. Но кажется, проблема была всё-таки не в этом

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

да, я бы сделал так, хотя понял что вы пробовали уменьшить число аллокаций

responses.put(url, response);
}
if (unsuccessfulResponsesCount.get() >= ack) {
futures.add(CompletableFuture.completedFuture(null));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут наверное планировалось поставить return?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

если учитывать Ваш коммент выше, то получается так))

CompletableFuture<Response> futureResponse = proxyRequest(request, url);
CompletableFuture<Response> resultFuture = futureResponse.thenApply(response -> {
boolean success = ServerImpl.isSuccessProcessed(response.getStatus());
if (success && responsesCollected.getAndIncrement() < ack) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут что-то не то, на SUCCESS ответ, который будет ack+1 мы почему-то взведем unsuccessfulResponsesCount

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, проглядел этот момент. Исправлю.

long timestamp = httpResponse.headers().firstValueAsLong(RequestWrapper.NIO_TIMESTAMP_HEADER).orElse(0);
long timestamp = Long.parseLong(
httpResponse.headers()
.firstValue(RequestWrapper.NIO_TIMESTAMP_HEADER)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а эта бесполезная штука так и переехала дальше в этот стейдж?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нет, она не бесполезная. В ServerImpl идет проверка, есть ли этот хедер или нет

            String timestamp = response.getHeader(RequestWrapper.NIO_TIMESTAMP_STRING_HEADER);

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ага, я ошибся

List<Response> collectedResponses,
AtomicInteger unsuccessfulResponsesCount
) {
futures.add(new CompletableFuture<Response>().completeAsync(() -> {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а тут мы будем использовать commonPool, что плохо, лучше пользоваться своим пулом

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А нам ведь нужно создать отдельный пул под это, а не использовать пул из ServerImpl?

съедает сетевое взаимодействие нод, из-за того, что мы теперь не блокируемся на запросе к серверу.
В остальном всё выглядит также, почти всё процессорное время съедает сетевое взаимодействие.
#### ALLOC
Аллокации убили GC. ~97% аллоков занимает GC, а именно AllocateHeap. Видимо, я не совсем правильно использую CompletableFuture,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ну вообще для этого и есть инструмент, хорошо бы найти проблему и починить

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так как тест проходил локально, я подумал что проблема флаков либо у кого-нибудь другого, либо агент подвисает. И только уже при профилировании заметил, что проблема всё-таки у меня. В шестом этапе я пытался исправить логику с CompletableFutures, думал, что они у меня подвисают в памяти, но кажется это не помогло. Тесты на агенте там прошли, и я думал что проблема тоже ушла, ведь профилирование ещё не делал на том этапе. Вот сегодня как сделал профилирование, снова увидел, что проблема никуда не ушла. Пока что не разобрался с чем именно проблема, ведь CompletableFutures, вроде как, попытался исправить.
И странно, ведь именно после этого этапа у меня GC начал занимать все аллокации на JVM. Возможно, имеет смысл проверить через visualvm, посмотреть что в рантайме находится в памяти.

@atimofeyev
Copy link
Contributor

  • тесты не проходят

@stormrvge
Copy link
Contributor Author

@atimofeyev

  • тесты не проходят

Они не проходят на агенте скорее всего из-за большого потребления памяти. Локально все тесты проходят.

@stormrvge
Copy link
Contributor Author

@atimofeyev исправил код по комментариям

Copy link

@codeclimate codeclimate bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR diff size of 8202 lines exceeds the maximum allowed for the inline comments feature.

Andrey Svistukhin added 2 commits May 1, 2024 17:20
Copy link

@codeclimate codeclimate bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR diff size of 8197 lines exceeds the maximum allowed for the inline comments feature.

@stormrvge
Copy link
Contributor Author

После исправления ошибки с

                if (success && responsesCollected.getAndIncrement() < ack) {

тесты начали проходить, я решил проверить профилировщик, подумал что может быть отсюда и утечка, но нет, GC до сих пор ест аллоки

return new CompletableFuture<Response>().completeAsync(() -> {
Response response = handle(request);
if (ServerImpl.isSuccessProcessed(response.getStatus())) {
collectedResponses.add(response);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

здесь идет незащищенное обращение к коллекции из разных потоков, должны быть ошибки

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а, и правда
я почему-то подумал, что можно и обычный arraylist сделать, так как у нас для каждого запроса будет создаваться свой лист, но проблема будет именно из-за того, что в разных потоках добавляем туда
изначально у меня и было на скиплисте, но что-то я решил поменять на arraylist

Copy link
Contributor Author

@stormrvge stormrvge May 6, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А, нет, я на ArrayList не менял
Я передаю в метод

        List<Response> validResponses = new CopyOnWriteArrayList<>();

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

хорошо, значит я проглядел

CompletableFuture<Response> resultFuture = futureResponse.thenApply(response -> {
boolean success = ServerImpl.isSuccessProcessed(response.getStatus());
if (success && responsesCollected.getAndIncrement() < ack) {
collectedResponses.add(response);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

здесь идет незащищенное обращение к коллекции из разных потоков, должны быть ошибки

Copy link

@codeclimate codeclimate bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR diff size of 8197 lines exceeds the maximum allowed for the inline comments feature.

@atimofeyev atimofeyev merged commit a3f693f into polis-vk:main May 14, 2024
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants