Задать вопрос
  • C# и несколько CPU?

    iamserge
    @iamserge Автор вопроса
    mayton2019, А, ну в этом смысле - да, правда там глобальный словарь массивов, там-то я просто и ищу ... Использую lock() а словарь заполняется когда загружены и подготовлены данные из сети/диска, и готовы ссылки на задачки новые. В общем то простая система, меня сбило с толку всякое MQ непонятное

    Увы и ах, пока кажется вообще не ясно как решить проблему =( На Linux вообще по умолчанию доступно судя по всему =/
    Написано
  • C# и несколько CPU?

    iamserge
    @iamserge Автор вопроса
    mayton2019, Вот тут вот не понял совсем ... Что такое MQ и что оттуда должно приходить...
    Написано
  • C# и несколько CPU?

    iamserge
    @iamserge Автор вопроса
    Я сделал то же самое:

    PS C:\Users\Sergey> cd e:
    PS E:\> cd test
    PS E:\test> dotnet new console
    The template "Console App" was created successfully.
    
    Processing post-creation actions...
    Restoring E:\test\test.csproj:
      Determining projects to restore...
      Restored E:\test\test.csproj (in 123 ms).
    Restore succeeded.
    
    
    PS E:\test> dotnet run
    The number of processors on this computer is 44.
    PS E:\test>


    Ах и да - это у меня Windows 10! Едрен батон ...
    Написано
  • C# и несколько CPU?

    iamserge
    @iamserge Автор вопроса
    Ну потоки я создаю в ограниченном количестве, т.е. их несколько типов я вручную подгоняю по количеству ориентируясь на то справляются они с задачами или нет... При этом они сами находят себе новые задачи и выполняются все время, даже когда задач по факту нет, т.е. висят в таком виде:

    while(true)
    
    int idForTheCalc =  int.MaxValue
    // Ищу задачу на день и если нашел, тогда idForTheCalc получает id
    
                    // Если так и остался id по умолчанию, значит спим
                    if (idForTheCalc == int.MaxValue)
                    {
                        System.Threading.Thread.Sleep(2000);
                        continue;
    
                    }
    
    //Если нашел, то делаю что нибудь или опять искать и спать, если задач нет
    
    }
    Написано
  • C# и несколько CPU?

    iamserge
    @iamserge Автор вопроса
    У меня WPF на Net8 и по умолчанию исползуется только один CPU, второй он просто игнорирует ...
    Написано
  • Как в numpy.anywhere - как искать только первый?

    iamserge
    @iamserge Автор вопроса
    Максим Припадчев, Данные примерно такие

    unixtimestamp + float + еще всякие цифры в каждой строке. Именно по float годными оказывается с десяток и более строк, где нужна только первая ... Ну в прицнипе вся суть в работе anywhere. Он возвращает индексы, а мне нужно индекс первого соответствующего условиям.
  • Как обработать такое исключение в c#?

    iamserge
    @iamserge Автор вопроса
    Роман, Только в php сайт не ложится для всех, когда один из 100 скриптов для одного клиента чего-то не смог сделать=)

    Ну потоков в целом 30 штук, по три на траблицу, объем запросов не знаю в целом, но в пиках их эдак 10k/секунда может быть, само собой они там в очереди топчатся и я использую MEMORY таблицы.

    В целом пока я "придумал" и почти сделал:
    1. try{} catch{} на всю функцию потока
    2. Если процесс умер - запускаю заново
    3. Храню их все время в списке
    4. Пишу код так, чтобы восстанавливаться в духе save/load или снапшотов и т.п. (хотя он и так такой, новые ошибки каждый раз меня вынудили думать об этом почти сразу)

    Да тут даже не в коде дело, часто об это спотыкаюсь и долго ищу решения иногда, надоело довольно быстро страдать от этой проблемы
  • Как обработать такое исключение в c#?

    iamserge
    @iamserge Автор вопроса
    Все исключения обязаны наследоваться от базового.
    Перехватить нельзя всего несколько очень специфичных исключений типа OOM

    Тогда пожалуй и стоит взять это на вооружения, т.е. для меня c# не особо привычная среда с его компилятором - когда одна ошибка приводит к тому что все приложение разваливается. Хотя может есть и лучше способы ...
  • Как обработать такое исключение в c#?

    iamserge
    @iamserge Автор вопроса
    Василий Банников, Хм, а вот кстати на счет всего кода - добавлю пожалуй я один try{}catch{} на всю что внутри функции потока ... Хм, вообще "Exception" вроде бы как общий, но я не до конца понимаю пределы его "власти" т.е. насколько он резиновый чтобы обо всем сообщать ... ? То есть я про то, как все будет выглядеть если я хочу переловить вообще все что только может случиться? Ну и наверное их будет все же 2-3 штуки, а может и один большой - не знаю пока как лучше и правда ... Надо серьезно этим заняться ...

    Да и почитал, кажется это работает с try{} тотальным почти так же как и без, но за то я буду контролировать процесс весь, а не мучаться с такими проблемами ... Даже если не могу обработать нормально или найти причин - смогу что-то сделать, чтобы недопустить краха приложения и справится без перезапуска.
  • Как обработать такое исключение в c#?

    iamserge
    @iamserge Автор вопроса
    Василий Банников, ок, ее бы просто поймать хотя бы и пусть даже перезапустить поток ... Правда не понимаю связи между потоком и SQL, потоки чудно работают по многу времени и ждут себе долгих запросов без проблем. А иногда бац и это исключение по необъяснимым причинам ...
  • Как обработать такое исключение в c#?

    iamserge
    @iamserge Автор вопроса
    Василий Банников, Пока один постоянный на UPDATE и по дефолту на SELECT т.е. там вроде 30 сек.

    Не совсем понял где именно, но "Exception Unhandled" в заголовке ну или "System.ArgumentOutOfRangeException:" перед текстом ошибки ... Да действительно, аргументы вне диапазона ... Ничего правда не понял, какие аргументы у меня и куда вообще вдруг вышли за какие такие пределы ...
  • Как обработать такое исключение в c#?

    iamserge
    @iamserge Автор вопроса
    Василий Банников, Я так догадываюсь что речь не о MySQL, а кроме него я ничему не указываю timeout ...

    using (MySqlConnection UpgradeConnection = new MySqlConnection(SQLConnect))
                            {
    
                                MySqlCommand updateCommand = UpgradeConnection.CreateCommand();
                                updateCommand.CommandText = String.Join("", SQL_QUERIES.ToArray());
                                updateCommand.CommandTimeout = 180;
                                UpgradeConnection.Open();
                                updateCommand.ExecuteNonQuery();
    
                            }


    А так создаю поток каждый ...
    Thread pPointThread = new Thread(() => pPointsCalculate(InitName, "Week", NextRow));
    
                        activeThreads.Add(new threadData
                        {
    
                            id = pPointThread.ManagedThreadId,
                            InitName = initGrid.Rows[NextRow.Index].Cells[0].Value.ToString(),
                            thread = pPointThread,
                            type = "pPointsWeekly"
    
                        });
    
                        pPointThread.Start();


    Ну и потом ничего с ними не делаю, кроме как статус смотрю иногда как он там по таймеру обновляется это перебором списка всех что есть потоков ...

    Два: в стектрейсе пишется ещё тип исключения. Скорее всего тут какой-нибудь ArgumentException

    Сейчас достану скоро ... Не редкость они у меня .... Если он нигде их не хранит старые ...
  • C#+MySQL как избежать блокировок таблиц?

    iamserge
    @iamserge Автор вопроса
    И дополнительно еще такая ошибка ...

    'Timeout can be only be set to 'System.Threading.Timeout.Infinite' or a value > 0.
    Parameter name: value'


    Прямо тут на строке с ExecuteNonQuery для UPDATE, странно что же она не ловится ...

    try
                                {
    
                                    updateCommand.ExecuteNonQuery();
    
                                }
                                catch (MySqlException Ext)
                                {
    
                                    checkpPointsLog.Invoke((MethodInvoker)delegate
                                    {
                                        UpdateLog(Ext.Message);
                                    });
    
                                }
  • C#+MySQL как избежать блокировок таблиц?

    iamserge
    @iamserge Автор вопроса
    Все мои ошибки это:
    Fatal error encountered during command execution.
    Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. (уже 240 сек. и кажется это трата времени просто ...)
  • C#+MySQL как избежать блокировок таблиц?

    iamserge
    @iamserge Автор вопроса
    Román Mirilaczvili, Нет, пока нет, а на сколько это может позволить выйграть в расходах? Просто если просто сократить время чтобы позволить другим пробиться - то кажется зачем, рано или поздно всем достанется ... А как спадет нагрузка, то там сократится это число сильно. Спадает она когда все старое насчитано и ничего кроме +0,5-10 запросов в таблицу каждую не пишется и собственно значит и считать больше не для кого. Я вообще мог бы их разделить на много маленьких - подумалось мне ... => Вопрос только где тут баланс между разером запроса и их количеством.

    Что касается скорости на запись (ну просто INSERT'ы) + один поток (тот что считает double в рамках арифметики обычной + выдает кучу "UPDATE ... WHERE id = X") и все это для десяти таблиц. То есть на каждую табличку вышло по 2 потока - один пишет, один обновляет => Итого работало 20 потоков, ничего не менял кроме как убрал/вернул ENGINE = MEMORY:

    1. Memory = 9 минут 3 секунды (Оперативка: 4 x 32Gb Hynix DDR4 REG ECC 2133 Mhz в четыре канала)
    2. InnoDB = 1,5 часа+ - все еще идет, видимо часа два будет (GIGABYTE GP-GSM2NE3256GNTD: ничего кроме MySQL на нем нет, выделен для СУБД)

    Сдается мне тут близко к тому, насколько железо отличается по скорости. С тем отличием, что для MEMORY скорость падает порядком т.к. они стоят в очереди периодически и просто не реализуют потенциал ...


    Так что итого думаю:
    1. Так что пока вариант с альтернативой СУБД'ам рассматривается в первую-вторую очередь, ну и приоритетно это RAM в качестве железа ... Был бы MySQL такой, ох кажется это было бы слишком хорошо ...

    2.Хотя я и попробую сначала отладить это, хотя бы чтобы найти причины ошибок по логам и оценить потенциал MySQL лучше - ну и сравнить, что получится с ramdisk при "innoDB in the RAM"
  • C#+MySQL как избежать блокировок таблиц?

    iamserge
    @iamserge Автор вопроса
    Akina, Ну она зародилась когда я сравнил скорости RAM/SSD и их задержки. Оказалось что SSD довольно быстро с ростом числа потоков сдувается. После чего стал эксплуатировать RAM ...

    Что касается опыта - ну почему нет, сейчас сломаю базы и засеку время расчетов по хоршему набору потоков, так чтобы было честно т.к. если сделать мало - SSD будет выглядить читерски хорошо на одном двух потоках.
  • C#+MySQL как избежать блокировок таблиц?

    iamserge
    @iamserge Автор вопроса
    Дмитрий, Ну я когда начинал не знал толком - ну и выбрал как самое универсальное. Но теперь разобрался - явно ничего не меняется и все так и остается без всяких изменений. В крайнем случае я буду стараться принудительно сводить все к одному виду, а если уж и будут исключения редкие - то может и правда ими стоит заняться отдельно. Потому что пока их даже в планах нет - глупо беспокоится сейчас о том, чего до сих пор нет.

    Хм, тарантул описывают так раз так, чтобы напомнить мне где у меня "болит":

    Tarantool можно использовать в сценариях OLTP вместо реляционной базы данных, и в этом случае он будет на порядки быстрее. Вы можете заменить традиционную связку база данных плюс кэш и выиграть от этого в операционных расходах по эксплуатации. Tarantool толерантен к нагрузке на запись ...


    Еще раз спасибо, кажется вот оно мое решение и может быть. Но думаю надо хотя бы на завтра отложить, у меня за день борьбы с MySQL уже просто голова устала, чтобы с разбегу на него запрыгнуть, на Тарантул этот или редис который я еще не гуглил даже
  • C#+MySQL как избежать блокировок таблиц?

    iamserge
    @iamserge Автор вопроса
    Дмитрий, Да спасибо, я тоже про логи подумал ... Кажется это было не зря, тут что то еще точно происходит. Но я думаю что если отдельно друг от друга блокировки проходят и могут пройти без ошибок - то запуск кучи потоков и ошибки в итоге могут быть связаны совсем не с блокировками ...

    Я еще таймауты уже по 3 минуты поставил еще на всякий случай.

    А что подразумевается под "key -value" - недопонял этот момент? Ну в целом у меня все делается по PRIMARY_KEY в WHERE, иначе никак т.к. много всякого и хочется быстрее - а это вроде бы как самый быстрый способ.

    Если в смысле выборок то они вида "SELECT * FROM table WHERE id > X ORDER BY id DESC/или без LIMIT n,m" обычно, там еще все про event вытягивается, fulltext и таких ужасов нет, все скромненько совсем по минимуму. Сортировки как воздух нужны - иначе если будут не по порядку будет ничего невозможно сделать - просто куча мусора будет. Это самое основное что явно нужно, ну может мало ли еще что - но вряд ли ...
  • C#+MySQL как избежать блокировок таблиц?

    iamserge
    @iamserge Автор вопроса
    Дмитрий, Однако, запрос вида UPDATE table SET pp = 1 WHERE id IN(20k id); вешает все очень сильно
    То есть получается он втискивается среди запросов из второго потока UPDATE table SET pp = 1 WHERE id = any int id;

    Но как его выловить в этой куче удачно я не понимаю, т.е. выудить "тормоза" ... То есть выловить проблемный "UPDATE table SET pp = 1 WHERE id = any int"

    Что кстати интересно, провисел довольно долго запрос в очереди ожидая длинного и без ошибок. Но это было всего два потока для одной таблицы. Ошибки же вовсю лезут стоит мне запустит скажем 20 потоков для 10 таблиц - тогда ничего не подвисает - просто вылеты ...

    Хм, может он отдельно и правда может нормально разобраться с блокировками, а проблемы с множеством потоков которые ломятся подключаться к MySQL ...

    То есть я о том, что видел визуально что остановилась очередь по интерфейсу - но она просто провисела и все, а потом пошла далее как ни в чем не бывало ... Просто у меня нет методов навешать на это получение расшифровки исполнения запроса проблемного ... НО оказывается он может повисеть без ошибок и продолжить, вот что меня удивило ...
  • C#+MySQL как избежать блокировок таблиц?

    iamserge
    @iamserge Автор вопроса
    Дмитрий, Про ramdisk я понял - про linux смотрел, но у меня Win и я надеюсь тут тоже все пройдет легко и безболезненно.

    С c# связано получение детализации запроса: метод писал и добивался вывода explain, т.е. и чтобы работало и чтобы как-то выудить что-то интересное. Сейчас надо будет видимо убить все таблицы, чтобы нагрузка скаканула ого как, а пока все заработало и это UPDATE при малой нагрузке (а я пока уничтожу свои таблички):

    continuing = 0.000023
    starting = 0.000041
    Executing hook on transaction = 0.000005
    starting = 0.000006
    checking permissions = 0.000005
    Opening tables = 0.000035
    init = 0.000009
    System lock = 0.000006
    Waiting for table level lock = 0.040106
    System lock = 0.000058
    updating = 0.000113
    end = 0.000006
    query end = 0.000006
    closing tables = 0.000016
    freeing items = 0.000069