Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ошибка Access violation


Автор: DmitryHT 21.9.2007, 23:15
Вообщем, при попытке испытать на максимуме грабер проксей обнаружил такую ошибку "Access violation ..."
Причем на 500 потоках все работает на Ура, но если выставить кол-во потоков еще больше (приблизительно > 800), то выскакивает указанная выше ошибка.

С чем это может быть связано?
Спасибо!  smile 

Автор: BaD_SeCt0R 21.9.2007, 23:25
Access violation - попытка доступа к несуществующим данным. Для более полного ответа дай больше данных

Автор: ALeXandrK 21.9.2007, 23:50
По токому вопросу можно точно сказать только одно: "Нарушение доступа ..."

Подробней давай... что за потоки, что делают. Код тут нужен.

Автор: aktuba 22.9.2007, 01:37
Цитата

приблизительно > 800


800 потоков при работе с сетью???? весело... показывай код - мне интересно даже стало, как это вообще может нормально работать...

Автор: W4FhLF 22.9.2007, 03:12
В системе максимальное число потоков ~2000, при дефолтном размере стека в 1 мб, при указании стека вручную при создании потока всё зависит от этой величины. Как удалось убедиться на практике, в пользовательской системе(т.е. не server) больше 1500 потоков нормально сосуществовать не могут. Памяти у тебя сколько? 

PS А зачем нужны 800 потоков для твоей задачи? 

Автор: DmitryHT 22.9.2007, 10:47
насчет кода даже не знаю какой участок предоставить...
такое кол-во потоков используется для чекинга работоспособности найденых проксей, т.к. их за 100 тысяч, то нужно максимально возможное кол-во потоков.

Цитата

800 потоков при работе с сетью???? весело... показывай код - мне интересно даже стало, как это вообще может нормально работать...

а почемы бы и нет? винда пропатчена на кол-во полуоткрытых соединений.

Работает сие на сервере с памятью в 1гиг всего, но по статистике память и процессор загружены лишь на половину.


Цитата

Access violation - попытка доступа к несуществующим данным


вот и я о том же...как при 500 потоках нет такой ошибки, а при выше 800 уже проскакивает и то не сразу?

Автор: ALeXandrK 22.9.2007, 11:37
Так может у тебя разные потоки работают с одинаковыми данными.
Один поток удалил переменную, а другой пытается к ней обратиться - вот и ошибка.

Может в этом проблемка...

P.s.: Попробуй уменьшить круг подозреваемых, если это возможно.

Автор: aktuba 22.9.2007, 12:36
Цитата

а почемы бы и нет? винда пропатчена на кол-во полуоткрытых соединений.


Да я и не говорю нет. Смотри - у тебя один список проксей и 800 потоков поочереди берут каждый пункт из списка и проверяют. Представим ситуацию - два потока взяли две последние строки. Первый поток проверил и оказалось, что прокся мертвая. Данная строка удаляется из списка, верно? Если да - вот тебе и ошибка, т.к. второй поток будет пытаться удалить строку, которой уже нет в списке...

Автор: MetalFan 22.9.2007, 16:53
мда... имхо хватило бы и 50 потоков при правильной реализации...
а без кода тут нечего и советовать... 
если есть AV, значит кто-то хочет пользовать что-то этому не пренадлежащее

Автор: Alexeis 23.9.2007, 22:30
MetalFan, не всегда, иногда отсутствующее. Вариантов много и гадать можно много, но лучше предположить что ошибка в 17й строке.

Автор: DmitryHT 24.9.2007, 10:18
Цитата(ALeXandrK @  22.9.2007,  11:37 Найти цитируемый пост)
P.s.: Попробуй уменьшить круг подозреваемых, если это возможно.


в результате этого обнаружил, что ошибка появляется в момент создания нового потока 
Код

potok[i_potok]:= tPotok.create(true);

в чем может причина ошибки в этом случае?


Цитата(MetalFan @  22.9.2007,  16:53 Найти цитируемый пост)
мда... имхо хватило бы и 50 потоков при правильной реализации...

и при какой же такой реализации  можно проверить более 100 тысяч прокси в 50 и 500 потоков с одинаковой скоростью?

Автор: DmitryHT 24.9.2007, 10:57
поставил приоритет на tplower стала появляться новая ошибка:
Цитата

Thread Error: The handle is invalid


кто-нибукдь в курсе из-за чего это?




up:
потом выставил на самый низкий tpIdle и опять получил Access Violation  smile 

Автор: Alexeis 24.9.2007, 11:01
DmitryHT, нужно учитывать реальные возможности сетевухи / модема. Они железные, а не резиновые  smile . Если представить, что среднее время пинга около 100мс, размер пакета 1,5 кб, то теоретически на 800 потоках можно пропинговать 8000 серверов в секунду. 8000 * 1,5 кб ~ 12 Мбайт/с, а с учетом паузы между ними и неравномерности прихода, то как минимум канал нужен как минимум 25 Мбайт/с, т.е. 200 Мбит / с, а то и больше ведь за это время нужно сделать 2е операции. 1 передать 1 получить.
  Вот и получается что потоков много, но они простаивают.

Автор: DmitryHT 24.9.2007, 11:05
Цитата

Вот и получается что потоков много, но они простаивают. 


так разве в случае простоя должна происходить ошибка?
п.с. канал 100 Мбит/с

Автор: Alexeis 24.9.2007, 11:17
  Канал 100Мбит это сеть или интернет? Обычная сетевуха на 100Мбит пропускает реально около 75Мбит. Это к тому что неплохо бы расчитать сколько все таки трафика уходит за минуту при непрерывном пинге и сколько за минуту серверов проверено, отсюда можно посчитать сколько трафа реально уходит на пинг одного сервера т.е. посчитать сколько теоретически можно пропинговать за это время и поставить реальное число потоков. 
Цитата(DmitryHT @  22.9.2007,  10:47 Найти цитируемый пост)
винда пропатчена на кол-во полуоткрытых соединений.


Может и в том что пропатчена винда, ведь ограничения не зря стоят... 

Автор: DmitryHT 24.9.2007, 11:23
Цитата(Alexeis @  24.9.2007,  11:17 Найти цитируемый пост)
 Канал 100Мбит это сеть или интернет?

интернет

ок, попробую подсчитать максимально возмоджное кол-во потоков : smile 

Автор: MetalFan 24.9.2007, 13:13
если у тебя широкий канал, то это не значит, что и у пингуемого тоже)

Автор: Alexeis 24.9.2007, 13:18
Цитата(MetalFan @  24.9.2007,  13:13 Найти цитируемый пост)
если у тебя широкий канал, то это не значит, что и у пингуемого тоже)

  Ну так и я о том же. Скорость проверки будет сначала быстро рости, а затем перейдет в насыщение. Вот этот момент и нужно отловить. Т.е. когда при увеличении числа потоков скажем в 2 раза прирост скорости проверки уже будет 5%, то пора останавливаться.

Автор: MAX2002 24.9.2007, 13:48
800 потоков на рабочей станции это не предел при грамотной реализации кода...
могу посоветовать сделать корректную отработку ошибок на выделение памяти, на очистку и освобождение дескрипторов, у меня , когда я писал прокси, под большой нагрузкой и длительном использовании не хватало дескрипторов в системе smile)) 

Автор: Romikgy 24.9.2007, 20:20
имхо все это (обсуждение) гадания на кофейной гуще, ибо кода нет , а ошибку можно заронить и в самом неожиданом месте

Автор: DmitryHT 24.9.2007, 23:11
я же уже отписал, что ошибка была при создании нового потока...
после доработки кода (обработки исключений) стало нагдядно видно, что кол-во рабочих потоков плящет от 880 до 990 если выставлять на 1000 максимум.

Автор: aktuba 25.9.2007, 07:07
Цитата

кол-во рабочих потоков плящет от 880 до 990 если выставлять на 1000 максимум. 


Как это???  smile Ты программированием занимаешься или в лотерею играешь? Незнаю как ты, но если я в программе ставлю 100 потоков, то и работает у меня ровно 100 потоков...

Автор: DmitryHT 25.9.2007, 09:47
 smile 
ага в суперлото на делфи

по теме: кол-во потоков зависит от свободных ресурсов системы поэтому при высвобождении части ресурсов и потскакивает.

если я там поставлю 100 потоков - то оно естественно будет их держать, т.к. такое кол-во не грузит систему

Автор: aktuba 25.9.2007, 12:31
Цитата

но по статистике память и процессор загружены лишь на половину.


Цитата

по теме: кол-во потоков зависит от свободных ресурсов системы поэтому при высвобождении части ресурсов и потскакивает.


Уверен что проблема в этом?

Автор: DmitryHT 25.9.2007, 13:36
да нет уже никакой проблемы smile

п.с. всем давно уже спасибо за наводки

Автор: creas0ft 4.10.2007, 00:40
2DmitryHT - Дык, везде "свои" люди.  Чтобы убыстрить процесс чекинга.
1) Сначала получай только ответ от сервера, или пинг или хеад.
2) Стоит увеличить время коннекта и таймаута, так как в реале винда не всегда сразу успевает послать пакет на удаленный сервер.
3) Поищи тут мои топики насчет менеджера потоков, это в реале сразу снимет много проблем с твоей текущей и будущей задач. ))

Автор: fse 4.10.2007, 01:03
Жесть... Чуть-чуть до штукаря потоков не дотянул... Извини, конечно, ошибка "аксес неволялся" возникает обычно только из-за корявого доступа к памяти. Не удивлюсь, если 800 потоков просто рвут проц и память на куски, не так-то просто синхронизировать доступ к памяти такому числу тхреадов.
Мне кажется, надо изначально пересмотреть структуру программы......

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)