powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Долгое закрытие JDBC
25 сообщений из 59, страница 2 из 3
Долгое закрытие JDBC
    #38438567
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczkill -3 PID
можно jdk/bin/jstack PID
Сейчас 9к потоков. Как потом найти тормоза?
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438570
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczА какой размер SESSIONS[]? По одному элементу на поток, или меньше?
13к. Но незанятые null. Что я и проверяю в цикле тоже.
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438580
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно отобрать те, которые заблокированы и посмотреть на чем они заблокированы, на JDBC или на synchronized.
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438589
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фига се... 9к потоков. Зачэм стока?
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438592
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно как-то поймать момент, когда соединение висит N секунд и снять в этот момент дамп потоков?
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438601
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczФига се... 9к потоков. Зачэм стока?
Ну сервер в работе :)
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438602
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczА можно как-то поймать момент, когда соединение висит N секунд и снять в этот момент дамп потоков?
Сейчас попробую.
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438606
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelНу сервер в работе :)
Дык по потоку на сессию, это как-то расточительно. Всё равно активных потоков минимум.
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438610
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczGorloPavelНу сервер в работе :)
Дык по потоку на сессию, это как-то расточительно. Всё равно активных потоков минимум.
Это сокет соединения. Они должны быть всегда online.
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438613
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно зашедулить jstack, и запустить тест. Потом отобрать тот дамп, который создан в момент "зависания", согласно логу теста.
Правда, боюсь, с 9К потоков jstack может отнимать слишко много времени :(
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438615
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelЭто сокет соединения. Они должны быть всегда online.
И что? Из 9K потоков у вас 99% всегда спят. Хорошо что переключение контекста на современном железе уже не такое дорогое. Иначе бы всё умерло. Ну, и линух решает тоже.
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438617
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что мешает для начала запустить отдельный инстанс с 1 потоком и посмотреть?
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438619
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel,
- сказал же - выруби в коде хождение по датасету и проверь тормоза
- потом ходи по датасету вхолостую
Обычный метод поиска неисправности вырубая блоки поочерёдно.
Логирование - это второй метод поиска.
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438631
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это game сервер и среди этих 9К сессий много активных, то вполне возможно что sendData этого потока рассылки постоянно конкурирует с остальными 9К потоков за многие synchronized.
Пессимистичные блокировки вообще в многопоточном сервере - зло.
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438653
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЕсли это game сервер и среди этих 9К сессий много активных, то вполне возможно что sendData этого потока рассылки постоянно конкурирует с остальными 9К потоков за многие synchronized.
Пессимистичные блокировки вообще в многопоточном сервере - зло.
Это сервер одного популярного приложения для OS Android. Ну ведь synchronized sendData актуален только для самого потока. Он никак не может конкурировать с остальными. Максимум с одним. Хотя... Hub.GSON.toJson это static поле в классе Hub. И насколько я понял GSON потокобезопасен, следовательно synchronized. Вот тогда он и может конкурировать с остальными 9к, так как в них существует еще несколько функций с использованием GSON. Может в этом проблема?
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438663
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel,

автор потокобезопасен, следовательно synchronized совсем не обязательно. Хотя GSON вообще сам по себе очень медленный, если его использовать без кастомных мапперов.
Проблема ещё может быть в fetchSize = 1 (у постгре по дефолту кажется 1), поставьте его чуть более чем ожидаете получить записей (ну если их не более 2-3, как Вы утверждаете).
Алсо непонятно зачем там комит и автокомит, вы же вроде только читаете данные (хотя тут я не уверен, давно в голом jdbc не копался).
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438667
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelНу ведь synchronized sendData актуален только для самого потока.
Что значит актуален? У вас в SESSION, вероятно есть и другие synchronized методы, которые гарантируют целостность записи пакетов в сокет. И у вас 9К потоков, которые использую эти методы. С этим проблем нет, и даже перфоманс нормальный, благодаря Biased Locking. Но тут приходится 9К+1й поток и начинает использовать те же самые сокеты, работа с которыми синхронизирована.
В результате в 9К вызов sendData N% приводят к блокировке на synchronized.
Вот такая теория...
Кстати ещё интересно, если вдруг у вас в SESSION есть и запись и чтение, то они используют один и тот же лок. Хотя запись с чтением сокета могут происходить безопасно в разных потоках.

GorloPavel Он никак не может конкурировать с остальными. Максимум с одним.
Почему? Из 9К потоков только один активный?

GorloPavelИ насколько я понял GSON потокобезопасен, следовательно synchronized.
facepalm
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438669
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще запуск с сэмплирующим профайлером или просто анализ дампов может показать причину без всяких угадаек.
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438670
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор Хотя GSON вообще сам по себе очень медленный, если его использовать без кастомных мапперов.
Что посоветуете? Сейчас я пользуюсь сериализацией-десереализацией. Воде быстренько все.
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438677
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel,

Для начала бы локализовать текущую проблему ).

GorloPavelВоде быстренько
Ну не знаю как сейчас, я пару лет назад смотрел, массив из 1000 даблов сериализовался около 1 секунды на Core 2 duo 2ГГц. Но там можно прикручиавть свои мапперы, чтоб не использовалась рефлексия и т.п., так что я думаю надо посмотреть что к чему.
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438682
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczGorloPavelНу ведь synchronized sendData актуален только для самого потока.
Что значит актуален? У вас в SESSION, вероятно есть и другие synchronized методы, которые гарантируют целостность записи пакетов в сокет. И у вас 9К потоков, которые использую эти методы. С этим проблем нет, и даже перфоманс нормальный, благодаря Biased Locking. Но тут приходится 9К+1й поток и начинает использовать те же самые сокеты, работа с которыми синхронизирована.
В результате в 9К вызов sendData N% приводят к блокировке на synchronized.
Вот такая теория...
Кстати ещё интересно, если вдруг у вас в SESSION есть и запись и чтение, то они используют один и тот же лок. Хотя запись с чтением сокета могут происходить безопасно в разных потоках.

GorloPavel Он никак не может конкурировать с остальными. Максимум с одним.
Почему? Из 9К потоков только один активный?

GorloPavelИ насколько я понял GSON потокобезопасен, следовательно synchronized.
facepalm
Потому что в логике сервера с одним потоком может взаимодействовать только один поток. Включая вызывать его sendData со своими данными. Не понял как sendData одного потока может блокировать sendData во всех потоках?
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438685
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зашедульте jstack на каждую секунду с добавлением в файл. Запустите тест. Отшедульте jstack. В полученом файле найдите все дампы с вашим методом. Смотрите на чем чаще всего он висит. На JDBC, на socket write или sendData
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438690
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelПотому что в логике сервера с одним потоком может взаимодействовать только один поток. Включая вызывать его sendData со своими данными. Не понял как sendData одного потока может блокировать sendData во всех потоках?
Всё, понял. Там не массовая рассылка на 9К сессий, а лишь на одного юзера? Т.е. sendData вызывается всего несколько раз?
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438697
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас лог всего на 3 точки. А нужно было больше делать
- начало метода
- после получения connection
- после запуска запроса
- после цикла
- после close()
И выяснить кто из них действительно тормозил.
...
Рейтинг: 0 / 0
Долгое закрытие JDBC
    #38438705
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczGorloPavelПотому что в логике сервера с одним потоком может взаимодействовать только один поток. Включая вызывать его sendData со своими данными. Не понял как sendData одного потока может блокировать sendData во всех потоках?
Всё, понял. Там не массовая рассылка на 9К сессий, а лишь на одного юзера? Т.е. sendData вызывается всего несколько раз?
Нет. Объясню. Есть к примеру два ПК между ними устанавливается связь средством удаленного сервера к которому они оба подключаются. Они могут инициировать вызов функций на сервере(авторизация, редактирование списка контактов и т.д) так и передавать данные друг другу(псевдо peer-to-peer) если невозможно подключение напрямую. В случае если они передают данные друг другу через сервер, то они вызывают перегруженный метод sendData(byte[]) друг у друга при получении данных который шлет пакет без изменений.
...
Рейтинг: 0 / 0
25 сообщений из 59, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Долгое закрытие JDBC
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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