stupid problem. I get those from a client connecting to a server. Sadly, the setup is complicated making debugging complex — and we run out of options.
The environment:
*Client/Server system, both running on the same machine. The client is actually a service doing some database manipulation at specific times.
* The cnonection comes from C# going through OleDb to an EasySoft JDBC driver to a custom written JDBC server that then hosts logic in C++. Yeah, compelx — but the third party supplier decided to expose the extension mechanisms for their server through a JDBC interface. Not a lot can be done here
The Symptom:
At (ir)regular intervals we get a «Address already in use: connect» told from the JDBC driver. They seem to come from one particular service we run.
Now, I did read all the stuff about port exhaustion. This is why we have a little tool running now that counts ports and their states every minute. Last time this happened, we had an astonishing 370 ports in use, with the count rising to about 900 AFTER the error. We aleady patched the registry (it is a windows machine) to allow more than the 5000 client ports standard, but even then, we are far far from that limit to start with.
Which is why I am asking here. Ayneone an ide what ELSE could cause this?
It is a Windows 2003 Server machine, 64 bit. The only other thing I can see that may cause it (but this functionality is supposedly disabled) is Symantec Endpoint Protection that is installed on the server — and being capable of actinc as a firewall, it could possibly intercept network traffic. I dont want to open a can of worms by pointing to Symantec prematurely (if pointing to Symantec can ever be seen as such). So, anyone an idea what else may be the cause?
Thanks
Проблема «Address already in use bind windows» возникает, когда программа пытается привязать серверный сокет к IP-адресу и порту, который уже используется другим процессом. Это может произойти, например, если вы пытаетесь запустить несколько экземпляров одного и того же сервера на одном компьютере.
Возможной причиной данной проблемы также является неправильное завершение работы программы, когда серверный сокет не был корректно освобожден, и его состояние остается активным на компьютере.
Для решения проблемы «Address already in use bind windows» можно предпринять несколько шагов. Во-первых, попробуйте найти процесс, который уже использует заданный порт, и завершите его. Это можно сделать с помощью команды Task Manager в Windows или команды kill в Unix-like системах.
Если завершение процесса не решает проблему, вы можете попробовать изменить порт, который используется вашей программой. В большинстве случаев это может быть сделано в настройках программы или в коде программы. Убедитесь, что вы выбираете свободный порт, который не используется другими процессами.
Содержание
- Как исправить ошибку «Address already in use bind windows»
- Проверка занятых портов
- Освободить занятый порт
Как исправить ошибку «Address already in use bind windows»
Ошибка «Address already in use bind windows» возникает, когда порт, который вы пытаетесь использовать, уже занят другим процессом или приложением на вашем компьютере. Эта ошибка может возникать при запуске серверного приложения или при подключении к базе данных.
Для исправления этой ошибки вам нужно найти процесс или приложение, которое занимает нужный вам порт, и завершить его работу.
Вот несколько шагов, которые помогут вам исправить ошибку «Address already in use bind windows»:
- Откройте командную строку на вашем компьютере.
- Введите команду «netstat -ano | findstr :«, заменив на номер порта, который вы пытаетесь использовать.
- Найдите процесс с соответствующим номером порта в столбце «PID» и запомните его.
- Откройте Диспетчер задач Windows, щелкнув правой кнопкой мыши на панели задач и выбрав пункт «Диспетчер задач».
- Перейдите на вкладку «Подробности» и найдите процесс с тем же идентификатором PID, который вы записали ранее.
- Щелкните правой кнопкой мыши на этом процессе и выберите пункт «Завершить задачу».
- Запустите ваше серверное приложение или подключитесь к базе данных снова.
После выполнения этих шагов ошибка «Address already in use bind windows» должна быть исправлена, и вы сможете успешно использовать нужный вам порт для своего приложения или подключения к базе данных.
Если эти шаги не помогли, вам может потребоваться проверить другие процессы или приложения, запущенные на вашем компьютере, и удостовериться, что нет никакого конфликта портов.
Проверка занятых портов
Часто возникающая ошибка «Address already in use bind windows» связана с тем, что порт, который вы пытаетесь использовать, уже занят на вашей системе. Для решения этой проблемы важно узнать, какие порты заняты и освободить их.
Существует несколько способов проверки занятых портов на Windows:
1. Команда netstat
Выполнение команды netstat -ano
в командной строке позволит вам увидеть список всех открытых соединений и занятых портов на вашей системе. В поле «PID» вы найдете идентификаторы процессов, которые занимают данные порты.
2. Диспетчер задач
Вы также можете проверить занятые порты с помощью Диспетчера задач Windows. Для этого откройте Диспетчер задач, перейдите на вкладку «Сеть» и найдите раздел «Сведения о сети». Здесь вы увидите список активных соединений и занятых портов.
3. Сторонние программы
Существуют программы, которые позволяют более удобно проверять занятые порты и управлять ими. Некоторые из них предоставляют графический интерфейс и подробную информацию о каждом соединении. Некоторые из таких программ включают TCPView, CurrPorts и FPort.
Когда вы найдете занятый порт, вам нужно будет освободить его, чтобы избежать ошибки «Address already in use bind windows». Для этого вы можете закрыть процесс, который занимает порт, или изменить порт, который ваше приложение пытается использовать.
Приведенные выше методы помогут вам проверить и управлять занятыми портами на вашей системе Windows, что даст возможность избежать ошибки «Address already in use bind windows».
Освободить занятый порт
Если вы сталкиваетесь с ошибкой «Address already in use bind windows», значит порт, который вы пытаетесь использовать, уже занят другой программой или службой на вашем компьютере.
Чтобы освободить занятый порт, вам необходимо выполнить следующие шаги:
- Узнайте, какая программа или служба использует нужный вам порт. Для этого можно воспользоваться командой «netstat -ano» в командной строке.
- Найдите в списке активных соединений программу или службу, использующую порт. Обратите внимание на идентификатор процесса (PID).
- Откройте диспетчер задач и найдите процесс с соответствующим идентификатором процесса (PID).
- Выделите процесс и нажмите кнопку «Завершить задачу».
- После завершения процесса, порт будет освобожден и вы сможете использовать его для своей программы или службы.
Обратите внимание, что завершение процесса может повлиять на работоспособность других программ или служб на вашем компьютере. Поэтому, перед завершением процесса, убедитесь, что это безопасно и не вызовет никаких негативных последствий.
В общем, развернутый локальный сервер, запущенный на Node, пришлось закрыть без остановки, и после этого не получается запустить новый сервер, выдается ошибка «EADDRINUSE: address already in use».
Оставлю пример, как решить эту проблему и запустить новый сервер.
Пример для Windows
Откройте окно CMD в режиме администратора, выбрав «Пуск» > «Выполнить» > введите cmd > щелкните правой кнопкой мыши «Командная строка» и выберите «Запуск от имени администратора» .
Используйте команду netstat, чтобы получить список всех активных портов. -a
переключатель отображает все порты в использовании, а не только порты, связанные с текущим пользователем. -n
опция останавливает поиск имени хоста (который занимает много времени). Эта -o
опция отображает ID процесса, который отвечает за активность порта. Команда findstr
соответствует строке заголовка, содержащей строку PID
, и порт, который вы ищете, в формате порта с предшествующим двоеточием :3000 .
netstat -ano|findstr "PID :3000"
Получаем ответ со списком процессов:
C:\Users\admin>netstat -ano|findstr "PID :3000" Proto Local Address Foreign Address State PID TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 18264
Чтобы убить этот процесс ( /f ):
Теперь можно запускать новый сервер.
Больше примеров для Mac/Linux можно найти здесь.
Ссылки для звонка/чата/перехода для мессенджеров (Skype, Viber, Telegram, WhatsApp, Facebook Messenger)
Постоянно приходится вспоминать как повесить правильную ссылку на чат скайпа или вайбера. Давно уже пора…
Настройка мобильного меню на сайте
Тема не новая, просто хочу вынести пример мобильного меню, который я использую чаще всего. На…
Как быстро переводить много текстов на разные языки с помощью Google Sheets и GoogleTranslate
Полезный инструмент, чтобы быстро перевести много небольших текстов на разные языки с помощью Google Sheets…
Рандомное добавление к числу
Пример простого скрипта с добавление к числу случайного числа в выбранном диапазоне. Для чего это…
думаю, что у вас просто закончились динамические порты в системе…..
ошибка (учитывая что изменение max_connection не помогает) формируется вовсе не из за mysql , а из-за невозможности винды предоставить нужное число портов.
WSAEADDRINUSE
(10048)
Address already in use.
Only one usage of each socket address (protocol/IP address/port) is normally permitted. This error occurs if an application attempts to bind a socket to an IP address/port that has already been used for an existing socket, or a socket that wasn’t closed properly, or one that is still in the process of closing. For server applications that need to bind multiple sockets to the same port number, consider using setsockopt(SO_REUSEADDR). Client applications usually need not call bind at all — connectwill choose an unused port automatically.»
что в общем случае означает —
Address already in use (Адрес уже используется).
Обычно разрешено только одно использование адреса сокета (проткол/адрес IP/порт). Эта ошибка возникает, когда приложение пытается привязаться к сокету функцией bind(), но комбинация адрес IP/порт уже используется существующим сокетом, или сокет не был корректно закрыт, или продолжается процесс закрытия сокета. Для серверных приложений, требующих привязки нескольких сокетов к одному и тому же номеру порта следует использовать setsockopt(SO_REUSEADDR). Клиентские приложения обычно не используют bind() — функция connect() автоматически выбирает неиспользуемый порт.
В вашем случае, при возрастании числа запросов к базе, когда открывается и закрывается куча подключений к базе, то оти попросту не успевают закрыться. Обратите внимание, что речь идет не о том, чтобы не забыть закрыть подключение mysql, а о том, что ресурсы для НОВОГО подключения освободятся не сразу….
Если мне память не изменяет, то есть в реестре пара параметров, которые на это влияют.
один из них — TcpTimedWaitDelay. Этот параметр определяет интервал времени, в течение которого подключение находится в состоянии ожидания, прежде чем будет закрыто. Пока подключение находится в состоянии ожидания, пара сокетов не может быть использована повторно. А согласно RFC793, данное значение должно в два раза превышать максимальное время жизни пакета.
Если учесть что в Windows XP и Microsoft Windows Server 2003 значение по умолчанию было установлено на 120 секунд, то получается что целых 2 минуты система просто ждет никому не отдавая уже освободившийся ресурс.
ищем тут
- Код: Выделить всё • Развернуть
-
HKLM\SYSTEM\CurrentControLSet\Services\Tcpip\Parameters\TcpTimedWaitDelay
и уменьшаем значение.
если нет, то создаем
REG_DWORD – время в секундах , с допустимыми параметрами 30-300 (в десятичной системе)
и второй параметр это MaxUserPort
находится он в
- Код: Выделить всё • Развернуть
-
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
имеет тип DWORD и допустимые значения от десятичных 5000 (по умолчанию) до 65534
он определяет максимальный номер порта, который используется, когда программа запрашивает у системы доступный пользовательский порт.
в итоге изначально имеем в системе всего 5000-1024 = 3976 портов, доступных для приложений, да еще и повторно использовать их можно не чаще раза в 2 минуты…
отпишитесь, плиз, помогло написанное или нет ?
p.s. если параметра нет в реестре, то это не значит что он не используется, просто его значение принимается системой по умолчанию…..
по итогам размышлений над
http://bugs.mysql.com/bug.php?id=10498
и
http://bugs.mysql.com/bug.php?id=6580
Лучше установить FreeBSD, чем потратить 20 лет на Linux’ы и выяснить какой из них хуже.
I have been running into issues on Windows servers while running JMeter tests, but also when I have been tuning akka as described in another blog of mine https://www.baselogic.com/blog/development/java-javaee-j2ee/akka-actor-thread-utilization-and-optimization/ and after more digging, I have finally found the issue.
The issues have always been java.net.BindException: Address already in use: connect and I have been thinking this was some IO issue related to Disk or CPU but never had conclusive evidence and never found the smoking gun until now.
So today I was running JMeter on a windows machine attempting to send 250 concurrent requests to an Apache server for a load test and could not reach 250 concurrent threads on the machine where JMeter was running.
After searching, I found that this problem is Windows based. There is a article at https://support.microsoft.com/kb/q196271, which says Windows XP only will make outbound TCP/IP connections using ports 1024-5000, and takes up to 4 minutes to recycle them. Therefore, if you do a lot of connections in a short amount of time, you can easily eat that port range up if you are running load tests.
I found reference to this issue on Microsoft’s website: https://support.microsoft.com/kb/q196271
The default maximum number of ephemeral TCP ports is 5000 in the products that are included in the “Applies to” section. A new parameter has been added in these products. To increase the maximum number of ephemeral ports, follow these steps:
- Start Registry Editor.
- Locate the following subkey in the registry, and then click Parameters: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
- On the Edit menu, click New, and then add the following registry entry:
Value Name: MaxUserPort
Value Type: DWORD
Value data: 65534
Valid Range: 5000-65534 (decimal)
Default: 0x1388 (5000 decimal)
Description: This parameter controls the maximum port number that is used when a program requests any available user port from the system. Typically, ephemeral (short-lived) ports are allocated between the values of 1024 and 5000 inclusive. After the release of security bulletin MS08-037, the behavior of Windows Server 2003 was changed to more closely match that of Windows Server 2008 and Windows Vista. For more information about Microsoft security bulletin MS08-037, click the following article numbers to view the articles in the Microsoft Knowledge Base:
951746 MS08-037: Description of the security update for DNS in Windows Server 2008, in Windows Server 2003, and in Windows 2000 Server (DNS server-side): July 8, 2008
951748 MS08-037: Description of the security update for DNS in Windows Server 2003, in Windows XP, and in Windows 2000 Server (client side): July 8, 2008
953230 MS08-037: Vulnerabilities in DNS could allow spoofing
Exit Registry Editor, and then restart the computer.
This seemed like it was simple, but I was not able to find the correct editable parameter in my regedit.
Here is what I did to add this parameter:
- Right mouse clicked on Parameters.
- Create a new DWORD value with name MaxUserPort
- Right mouse click on MaxUserPort .
- then enter 65534 for the Value Data field.
- Under the radio button selection for Base, select the Decimal radio button.
Conclusion
Once I did this and te server restarted, I was able to run a JMeter test that created 1,000 concurrent requests to an Apache server for 5 minutes with zero errors.
Next Steps
My next step will be to load test the Akka based application against these new settings, as see how many threads I can now support.