-
Notifications
You must be signed in to change notification settings - Fork 48
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
Conversation
There was a problem hiding this 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.
There was a problem hiding this 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.
There was a problem hiding this 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.
There was a problem hiding this 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.
Проблему с аллокациями пофиксил в следующей лабораторной. Если нужно, могу изменения подлить сюда. |
There was a problem hiding this 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.
There was a problem hiding this 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, |
There was a problem hiding this comment.
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.
И лучше чтобы это было что-то одно
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Нужно было эти futures возвращать return'ом и дальше записывать их в структуру которая лежит по стеку вызовов выше? Я просто подумал, что может быть из-за этого у меня и сходил с ума GC. Но кажется, проблема была всё-таки не в этом
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
тут наверное планировалось поставить return?
There was a problem hiding this comment.
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) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
тут что-то не то, на SUCCESS ответ, который будет ack+1 мы почему-то взведем unsuccessfulResponsesCount
There was a problem hiding this comment.
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) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
а эта бесполезная штука так и переехала дальше в этот стейдж?
There was a problem hiding this comment.
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);
There was a problem hiding this comment.
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(() -> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
а тут мы будем использовать commonPool, что плохо, лучше пользоваться своим пулом
There was a problem hiding this comment.
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, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ну вообще для этого и есть инструмент, хорошо бы найти проблему и починить
There was a problem hiding this comment.
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 исправил код по комментариям |
There was a problem hiding this 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.
There was a problem hiding this 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.
После исправления ошибки с
тесты начали проходить, я решил проверить профилировщик, подумал что может быть отсюда и утечка, но нет, GC до сих пор ест аллоки |
return new CompletableFuture<Response>().completeAsync(() -> { | ||
Response response = handle(request); | ||
if (ServerImpl.isSuccessProcessed(response.getStatus())) { | ||
collectedResponses.add(response); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
здесь идет незащищенное обращение к коллекции из разных потоков, должны быть ошибки
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
а, и правда
я почему-то подумал, что можно и обычный arraylist сделать, так как у нас для каждого запроса будет создаваться свой лист, но проблема будет именно из-за того, что в разных потоках добавляем туда
изначально у меня и было на скиплисте, но что-то я решил поменять на arraylist
There was a problem hiding this comment.
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<>();
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
здесь идет незащищенное обращение к коллекции из разных потоков, должны быть ошибки
There was a problem hiding this 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.
No description provided.