LINUX.ORG.RU

Mono - потоки не работают

 , ,


0

1

Решил я наконец сделать консольную версию GAS(чуть пофикшенный LOIC).

Под оффтопом всё работало относительно нормально.

Но на сервере, при том же конфиге не было никакого результата.

htop показывает ~50 потоков вместо созданной тысячи, иногда вылетает с ошибкой

«libgcc_s.so.1 must be installed for pthread_cancel to work»

На пяти сотнях потоков всё работает так же, как на виндах.

mono-2.10.4

kernel-3.2.1

Кто-нибудь сталкивался с подобным?

Deleted

Последнее исправление: kasthack (всего исправлений: 1)

Вобще да, я как-то ковырялся с моно и заметил, что потоки по-разному работают под виндой и под линуксом... Т.е. производительность разная, в зависимости от разного количества потоков. Впрочем, ничего точно сказать не могу, т.к. глубоко не копал.
Потоков запускалось очень много.
Такого «libgcc_s.so.1 must be installed for pthread_cancel to work» не было.

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

не в производительности дело - потоки вообще не выполняются

Deleted
()
Ответ на: комментарий от Bad_ptr

Алсо, т.к. при 500 потоках создаются все, можно скорее было бы ожидать создания потоков до какого-то предела. «libgcc_s.so.1 must be installed for pthread_cancel to work», если верить гуглу, появляется при различии версий gcc, скомпилявшего софт и установленного,но на сервере gentoo -> совпадают

Deleted
()

Пример кода

Один из кусков кода, отвечающих за создание потока

Из https://github.com/kasthack/GAS/blob/master/GAS.Core/ReCoil.cs

Конструктор

 public ReCoil(string dns, string ip, int port, string subSite, int delay, int timeout, bool random, bool resp, int nSockets, bool usegZip,int threadcount)

        {

            ThreadCount = threadcount;

            this.WorkingThreads = new Thread[ThreadCount];

//инициализация всего остального
//....

Начало атаки

public override void Start()
        
{

            if (IsFlooding) Stop();

            IsFlooding = true;

            for (int i = 0; i < ThreadCount; (WorkingThreads[i] = new Thread(new ParameterizedThreadStart(bw_DoWork))).Start(i++));

            init = true;

        }
Deleted
()
Ответ на: комментарий от Reset

Естесственно есть, но он требует сильно больше ресурсов. Алсо, для каждого запроса будет создаваться отдельный поток, что явно не улучшит ситуацию с производительностью(в памяти хранится до 100K сокетов-> каждому из них будет выделен поток) К тому же создание > ~ 4K потоков вызывает OutOfMemoryException независимо от свободной памяти и платформы(1000 потоков свободно работвет на ПК с одним 1gb ram, 4000 K потоков вылетает на компе с 16 гигами)

Deleted
()

утром на другой linux - системе чекну, пересоберу mono

возможно конфиг ядра кривой

Deleted
()
Ответ на: комментарий от Deleted

Я не знаток C#, но то что ты пишешь выглядит бредом. В любом случае, 1000 потоков у тебя работать не будут, читай доки по асинхронному вводу/выводу в C#.

Reset ★★★★★
()

И вообще методы синхронизации придумали трусы?

Я про while init sleep.

ebantrop
()
Ответ на: комментарий от Reset

Будут, ибо managed thread != native thread. Не так легко как на ерланге, но жить как то будет. Другое дело что там просто бред написан. Не работает оно не потому что 1000 потоков, а потому что там шиз в синхронизации.

ebantrop
()
Ответ на: комментарий от ebantrop

Раньше было еще хуже. Со временем исправлю.

Deleted
()
Ответ на: комментарий от ebantrop

Я кодил исходя из мсовской реализации, где manadged thread == native thread. То же скажу и о while (!init) Thread.Sleep(100);

Deleted
()
Ответ на: комментарий от ebantrop

чуть подебажил. проблема таки в пингвине: Too Many Open Files

Deleted
()

Итог

Косяк был в пингвине. решилось с помощью ulimit -n99999

Deleted
()

господи, сделайте меня развидеть это. Почему нельзя переписать нормально без извращений?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.