13.09.19 — 14:39
Сервер 1С находится на одном сервере, пользователи подключаются с другого сервера по тонкому клиенту.
Столкнулись с проблемой: после какого-то кол-ва пользователей зашедших в базу, новых перестает пускать — просто падает платформа. Началось внезапно, ничего не меняли, ни конфигурацию, ни платформу, ни сервер. На текущей платформе проработали больше месяца нормально. Через технологический журнал на клиенте выцепил ошибку, с которой падает платформа «Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт)». Ошибку это возвращает платформе винда, везде пишут, что проблема в том, что не хватает динамических портов, которые можно расширить через реестр, но это не помогло.
Через netstat -ano на сервере удаленных рабочих столов, откуда подключаются пользователи видно, что заняты все порты с 1560 по 1591 тонким клиентом. Но многие клиенты сидят на рандомных портах типа 45434. Заметили, что новые пользователи не могут зайти в базу, когда все порты 1560-1591 заняты. Если убить любого тонкого клиента, который занимает порт в этом диапазоне и порт освобождается, то новый пользователь может зайти в базу.
Так же, когда все эти порты заняты, не получается запустить отладку из конфигуратора, ругается на «Для выполнения отладки необходимо включить поддержку сетевого протокола TCP/IP» — что тоже описано в инете как проблема занятых портов.
Не понятно, зачем тонкому клиенту на сервере удаленных рабочих столов занимать эти порты, ведь используются они сервером 1С для рабочих процессов. И почему когда свободных портов нет на РДП сервере, клиент не может подключиться к серверу 1С. Но часть клиентов спокойно висят на рандомных портах типа 45434. Такое ощущение, что при коннекте, клиент все таки занимает какой-то из портов в этом диапазоне, а после этого его перекидывает на любой свободный до 65535, но эти порты из диапазона 1560-1591 не успевают освободиться.
Объясните, по какому принципу клиент занимает порты и можно ли это как-то где-то настроить? То, что происходит в описанной ситуации это какой-то сбой либо некорректная настройка и достаточно в настройках службы 1С указать бОльший пул портов? Но никогда не слышал, чтобы в базах, где работает большое кол-во пользователей, увеличивали диапазон портов для рабочих процессов на сервере 1С.
1 — 13.09.19 — 14:57
В первый раз появилось на платформе 8.3.14.1854, после этого откатились на 8.3.12.1685, на которой были несколько месяцев, ситуация не изменилась.
2 — 13.09.19 — 15:53
вам хватит на 1 локальный порт 1561 всех подключить
сбрасывайте настройки в дефолт, переустанавливайте платформу.
3 — 13.09.19 — 16:03
(2) Так какие настройки? На РДП сервере стоит только тонкий клиент, какие и где там настройки можно сбросить?
4 — 13.09.19 — 16:05
https://its.1c.ru/db/metod8dev#content:5908:hdoc
6. Необходимо настроить сетевой стек для обеспечения возможности обработки большого числа подключений
Настройки, которые необходимо выполнить (в дополнение к настройке 5.2. Настроить рабочий сервер в соответствии с инструкцией):
Запустить regedit и в ветке HKLMSystemCurrentControlSetServicesTcpipParameters указать
MaxFreeTcbs= 100000
TcpTimedWaitDelay= 30
MaxUserPort= 65535
Запустить regedit и в ветке HKLMSystemCurrentControlSetServicesAFDParameters указать
EnableDynamicBacklog= 1
MinimumDynamicBacklog= 20
MaximumDynamicBacklog= 20000
DynamicBacklogGrowthDelta= 10
Устанавливаем диапазон исходящих портов (1025; 65535)
Выполнить: netsh int ipv4 set dynamic port tcp start=1025 num=64510
Выполнить: netsh int ipv4 set dynamic port udp start=1025 num=64510
5 — 13.09.19 — 16:16
(4) Все эти настройки сделаны, это все как раз гуглится по ошибке «Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт)». Но легче не стало вообще. Да и 80 пользователей не так много.
6 — 13.09.19 — 16:17
Проблема в том, что тонкий клиент почему-то занимает 1560-1591 порты на рдп сервере (не на 1С сервере) и из-за этого не могут подключаться новые клиенты. Так как если через netstat выбрать клиента, который занял 1560 порт, завершить его, то другой пользователь сможет зайти.
7 — 13.09.19 — 16:19
кто-то подкрутил параметр количество соединений на процесс?
8 — 13.09.19 — 16:19
сколько rphost на сервере?
9 — 13.09.19 — 16:27
(7) Вроде никто ничего не крутил. Сейчас стоит 128.
(8) 1.
10 — 13.09.19 — 17:59
режим отладки при запуске клиента?
11 — 13.09.19 — 18:43
(10) О, интересная мысль, надо будет проверить. Вообще запускается все без отладки, но вдруг каким-то образом она включается…
12 — 13.09.19 — 18:46
(10) (11) Во блин, точно! На одном из клиентов, который занял 1562 порт запущена отладка. Каким образом она могла включиться сама то?
13 — 16.09.19 — 11:25
Нашел в чем была причина, очень все нетривиально оказалось ) У нас в одном документе добавлено очень много доп.реквизитов, а чтобы они не подряд располагались на форме, была изменена форма в пользовательском режиме, красиво и по группам расположили доп.реквизиты.
Чтобы эта настройка применилась у всех, копировали все настройки эталонного пользователя другим пользователям. Видимо, в момент копирования настроек эталонного пользователя, у него была включена отладка, которая так и прилетела всем. Ну и в какой-то момент пользователей просто стало слишком много и проблема проявилась.
P_Mis
14 — 16.09.19 — 11:28
(13) Соответственно решение это в личных настройках пользователей очистить настройку из закладки Прочие настройки — Прочие настройки. Ну и переписать копирование настроек, если это делается автоматом.
Tweekaz 24 / 23 / 3 Регистрация: 21.04.2012 Сообщений: 253 |
||||
1 |
||||
Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)10.11.2012, 18:51. Показов 57157. Ответов 6 Метки нет (Все метки)
При запуске вызывается ошибка на строчке с Bind. Код Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)
Вот такое у нас..
__________________
0 |
16931 / 12508 / 3286 Регистрация: 17.09.2011 Сообщений: 20,745 |
|
10.11.2012, 19:01 |
2 |
Какое-то другое приложение уже принимает соединения на пор 7777.
1 |
24 / 23 / 3 Регистрация: 21.04.2012 Сообщений: 253 |
|
10.11.2012, 19:08 [ТС] |
3 |
Какое-то другое приложение уже принимает соединения на пор 7777. так на любом порте
0 |
16931 / 12508 / 3286 Регистрация: 17.09.2011 Сообщений: 20,745 |
|
10.11.2012, 19:29 |
4 |
так на любом порте Значит ваше же приложение, но с разных потоков.
1 |
Tweekaz 24 / 23 / 3 Регистрация: 21.04.2012 Сообщений: 253 |
||||
10.11.2012, 19:42 [ТС] |
5 |
|||
Значит ваше же приложение, но с разных потоков.
Вот весь код, то есть никак не могу сам забивать порт.
0 |
kolorotur 16931 / 12508 / 3286 Регистрация: 17.09.2011 Сообщений: 20,745 |
||||
10.11.2012, 20:55 |
6 |
|||
никак не могу сам забивать порт. Ну как же не можете, если забиваете?
2 |
24 / 23 / 3 Регистрация: 21.04.2012 Сообщений: 253 |
|
10.11.2012, 23:10 [ТС] |
7 |
kolorotur, спасибо, не додумался)
0 |
Понимаю, что тем с таким заголовком уже уйма, но ответа я так и не увидел. А точнее — что делать в моем случае.
Итак, делаю сервер, который слушает локалку по указанному порту. За основу взял эту библиотеку — https://github.com/nterry/AwesomeSockets.
Вот так выглядит метод запуска прослушивания:
public async void StartListening(int port)
{
if (CancellationTokenSource == null)
CancellationTokenSource = new CancellationTokenSource();
_cancellationToken = CancellationTokenSource.Token;
Clients = new ObservableCollection<Client>();
BindingOperations.EnableCollectionSynchronization(Clients, _lockObject);
try
{
while (_tcpListen == null)
{
ShowCallbackMessageAction?.Invoke("Try to start server");
_tcpListen = AweSock.TcpListen(port);
if (_tcpListen != null)
{
ShowCallbackMessageAction?.Invoke("Server started");
var waitForConnectionTask = Task.Run(() => WaitForConnectionLoop(), _cancellationToken);
var checkClientsConnectionTask = Task.Run(() => CheckClientsConnectionLoop(), _cancellationToken);
await Task.WhenAll(waitForConnectionTask, checkClientsConnectionTask);
}
// https://stackoverflow.com/a/32768637/4944499
await Task.Delay(1000, _cancellationToken).ContinueWith(task => { });
}
}
catch (Exception exception)
{
ShowCallbackMessageAction?.Invoke($"Error on start server: {exception.Message}");
}
}
Вот так метод остановки прослушивания:
public void StopListening()
{
ShowCallbackMessageAction?.Invoke("Begin stop server...");
ShowCallbackMessageAction?.Invoke("Disconnect all clients");
DisconnectAllClients();
CancellationTokenSource?.Cancel();
_tcpListen?.Close();
_tcpListen = null;
ShowCallbackMessageAction?.Invoke("Server stopped");
}
Метод из библиотеки, вызываемый в моем методе StartListening:
public static ISocket TcpListen(int port, int backlog = 10)
{
var listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//var ip = new IPAddress(new byte[] { 0, 0, 0, 0 });
//var localEndPoint = new IPEndPoint(ip, port);
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, port);
listenSocket.Bind(localEndPoint);
listenSocket.Listen(backlog);
return AwesomeSocket.New(listenSocket);
}
Так вот — это все работает до того момента, пока я приложение свое не закрою без отписки от прослушивания. Т.е., например, случился крэш. После того, как я повторно запускаю сервер, то вижу сообщение:
Везде пишут, что это нормально и порт сам освободится через некоторое время (вроде 240 секунд), но в моем случае этого не происходит. Помогает только перезагрузка компа.
Как быть?