| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Ошибка Access violation |
| Автор: DmitryHT 21.9.2007, 23:15 |
| Вообщем, при попытке испытать на максимуме грабер проксей обнаружил такую ошибку "Access violation ..." Причем на 500 потоках все работает на Ура, но если выставить кол-во потоков еще больше (приблизительно > 800), то выскакивает указанная выше ошибка. С чем это может быть связано? Спасибо! |
| Автор: BaD_SeCt0R 21.9.2007, 23:25 |
| Access violation - попытка доступа к несуществующим данным. Для более полного ответа дай больше данных |
| Автор: ALeXandrK 21.9.2007, 23:50 |
| По токому вопросу можно точно сказать только одно: "Нарушение доступа ..." Подробней давай... что за потоки, что делают. Код тут нужен. |
| Автор: aktuba 22.9.2007, 01:37 | ||
800 потоков при работе с сетью???? весело... показывай код - мне интересно даже стало, как это вообще может нормально работать... |
| Автор: W4FhLF 22.9.2007, 03:12 |
| В системе максимальное число потоков ~2000, при дефолтном размере стека в 1 мб, при указании стека вручную при создании потока всё зависит от этой величины. Как удалось убедиться на практике, в пользовательской системе(т.е. не server) больше 1500 потоков нормально сосуществовать не могут. Памяти у тебя сколько? PS А зачем нужны 800 потоков для твоей задачи? |
| Автор: DmitryHT 22.9.2007, 10:47 | ||||
| насчет кода даже не знаю какой участок предоставить... такое кол-во потоков используется для чекинга работоспособности найденых проксей, т.к. их за 100 тысяч, то нужно максимально возможное кол-во потоков.
а почемы бы и нет? винда пропатчена на кол-во полуоткрытых соединений. Работает сие на сервере с памятью в 1гиг всего, но по статистике память и процессор загружены лишь на половину.
вот и я о том же...как при 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:57 | ||
поставил приоритет на tplower стала появляться новая ошибка:
кто-нибукдь в курсе из-за чего это? up: потом выставил на самый низкий tpIdle и опять получил Access Violation |
| Автор: Alexeis 24.9.2007, 11:01 |
| DmitryHT, нужно учитывать реальные возможности сетевухи / модема. Они железные, а не резиновые Вот и получается что потоков много, но они простаивают. |
| Автор: DmitryHT 24.9.2007, 11:05 | ||
так разве в случае простоя должна происходить ошибка? п.с. канал 100 Мбит/с |
| Автор: Alexeis 24.9.2007, 11:17 |
| Канал 100Мбит это сеть или интернет? Обычная сетевуха на 100Мбит пропускает реально около 75Мбит. Это к тому что неплохо бы расчитать сколько все таки трафика уходит за минуту при непрерывном пинге и сколько за минуту серверов проверено, отсюда можно посчитать сколько трафа реально уходит на пинг одного сервера т.е. посчитать сколько теоретически можно пропинговать за это время и поставить реальное число потоков. Может и в том что пропатчена винда, ведь ограничения не зря стоят... |
| Автор: DmitryHT 24.9.2007, 11:23 |
интернет ок, попробую подсчитать максимально возмоджное кол-во потоков : |
| Автор: MetalFan 24.9.2007, 13:13 |
| если у тебя широкий канал, то это не значит, что и у пингуемого тоже) |
| Автор: Alexeis 24.9.2007, 13:18 | ||
Ну так и я о том же. Скорость проверки будет сначала быстро рости, а затем перейдет в насыщение. Вот этот момент и нужно отловить. Т.е. когда при увеличении числа потоков скажем в 2 раза прирост скорости проверки уже будет 5%, то пора останавливаться. |
| Автор: MAX2002 24.9.2007, 13:48 |
| 800 потоков на рабочей станции это не предел при грамотной реализации кода... могу посоветовать сделать корректную отработку ошибок на выделение памяти, на очистку и освобождение дескрипторов, у меня , когда я писал прокси, под большой нагрузкой и длительном использовании не хватало дескрипторов в системе |
| Автор: Romikgy 24.9.2007, 20:20 |
| имхо все это (обсуждение) гадания на кофейной гуще, ибо кода нет , а ошибку можно заронить и в самом неожиданом месте |
| Автор: DmitryHT 24.9.2007, 23:11 |
| я же уже отписал, что ошибка была при создании нового потока... после доработки кода (обработки исключений) стало нагдядно видно, что кол-во рабочих потоков плящет от 880 до 990 если выставлять на 1000 максимум. |
| Автор: aktuba 25.9.2007, 07:07 | ||
Как это??? |
| Автор: DmitryHT 25.9.2007, 09:47 |
| ага в суперлото на делфи по теме: кол-во потоков зависит от свободных ресурсов системы поэтому при высвобождении части ресурсов и потскакивает. если я там поставлю 100 потоков - то оно естественно будет их держать, т.к. такое кол-во не грузит систему |
| Автор: aktuba 25.9.2007, 12:31 | ||||
Уверен что проблема в этом? |
| Автор: DmitryHT 25.9.2007, 13:36 |
| да нет уже никакой проблемы п.с. всем давно уже спасибо за наводки |
| Автор: creas0ft 4.10.2007, 00:40 |
| 2DmitryHT - Дык, везде "свои" люди. Чтобы убыстрить процесс чекинга. 1) Сначала получай только ответ от сервера, или пинг или хеад. 2) Стоит увеличить время коннекта и таймаута, так как в реале винда не всегда сразу успевает послать пакет на удаленный сервер. 3) Поищи тут мои топики насчет менеджера потоков, это в реале сразу снимет много проблем с твоей текущей и будущей задач. )) |
| Автор: fse 4.10.2007, 01:03 |
| Жесть... Чуть-чуть до штукаря потоков не дотянул... Извини, конечно, ошибка "аксес неволялся" возникает обычно только из-за корявого доступа к памяти. Не удивлюсь, если 800 потоков просто рвут проц и память на куски, не так-то просто синхронизировать доступ к памяти такому числу тхреадов. Мне кажется, надо изначально пересмотреть структуру программы...... |