• 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
  • C#+MySQL как избежать блокировок таблиц?

    iamserge
    @iamserge Автор вопроса
    Дмитрий, Да я заметил, погуглю про ramdisk - памяти много и ее я в жертву. Пока пытаюсь понять как в c# выполнить все это ... Ramdisk это такой интригующий, у меня 128Гб есть за между делом ...

    set profiling = 1;
    "Many UPDATE .... ";
    show profiles;
    show profile for query N;
  • C#+MySQL как избежать блокировок таблиц?

    iamserge
    @iamserge Автор вопроса
    Дмитрий, То что касается update не пробовал, а при update я закидываю туда по 10 - 20к за раз, ну минимум 10 штук это сейчас ... Но у меня его нету, нужно судя по всему это все интегрировать как-то в c# и куда-нибудь ответ забрать ... - надо чуть доделать. Когда таблицы мрут (они же все таки memory) - я собираю в них данные из обычных (они как архивные стали) и начинаю все заново. Тогда там по очень много update'ов и получается чтобы догнать расчет до самых свежих - ну и потом опять по чуть чуть т.е. 10 шьук за раз в ногу с обновлениями свежих

    как бы тогда использование памяти будет весьма хреновым

    В каком смысле? Расходов больших объемов или скорость просядет?
  • C#+MySQL как избежать блокировок таблиц?

    iamserge
    @iamserge Автор вопроса
    Дмитрий, Там расчет по формулам банальный в принципе, т.е. на выходе double как вполне себе число обычное. А где [-1;2] присваивается, это группировка т.е. запись оценивается относительно окружения и ей присваивается значение от [-1;2] в зависимости от того "какая она" - плохая или полезная. Ну то что с double пролетает на скорости света, c# вообще не замечает, что посчитал что-то. Второй расчет подольше, т.к. он даже не расчет - а скорее сравнение .... ну или расчет логических уравнений, можно и так сказать.

    Это к тому чтобы вообще перейти на чистый SQL? Я о таком думал, но как мне это поможет непонятно, там ведь я буду как бы не дольше вешать таблицу т.к. буду все в запросе делать - выборку, расчеты, сравнения, а потом еще и обновления сразу - я так вообще могу ее не освободить то .... и судя по всему все это будет "висеть" все это время - пока эти дела делает шарп, закидывая в MySQL все готовеньнькое ...
  • C#+MySQL как избежать блокировок таблиц?

    iamserge
    @iamserge Автор вопроса
    Дмитрий, В самые лучшие времена т.е. сейчас когда я досчитал все по чуть-чуть (т.е. не даю ей иметь много не посчитанных данных) - примерно так, маленький SELECT отправил:

    starting 0.000082
    Executing hook on transaction 0.000005
    starting 0.000008
    checking permissions 0.000007
    Opening tables 0.000032
    init 0.000006
    System lock 0.000007
    Waiting for table level lock 0.037934
    System lock 0.000022
    optimizing 0.000013
    executing 0.000011
    end 0.000004
    query end 0.000007
    closing tables 0.000011
    freeing items 0.000060
    cleaning up 0.000015
  • C#+MySQL как избежать блокировок таблиц?

    iamserge
    @iamserge Автор вопроса
    Akina, Ну UPDATE'ы я готовлю пачками по 3-20к и потом за раз отправляю, т.е. так (там один запрос вида WHERE id IN(...) на самом деле т.к. расчетные значения это int [-1;2] и можно их упаковками отправлять группируя). Второй поток наоборот, там double на выходе расчетов и там нужно каждое писать отдельно ... Но принцип тот же - приготовил строку - отправил в такую же конструкцию.

    using (MySqlConnection UpgradeConnection = new MySqlConnection(SQLConnect)) {
    
                            MySqlCommand commTOTAL = UpgradeConnection.CreateCommand();
                            commTOTAL.CommandText = NO_pPOINTS_QUERY; // Тут уже вообще все готово как строка с кучей запросов - просто отправить ... 
                            commTOTAL.CommandTimeout = 120; // Уже докатился до 120 сек ...
                            UpgradeConnection.Open();
    
                            if (commTOTAL.CommandText.Length > 0)
                                commTOTAL.ExecuteNonQuery();
    
                        }


    По количеству - запросто, но как это эффективно посмотреть? Т.е. у меня примерные цифры, по тому сколько данных есть ... Ну и да, это подождать надо, сейчас там досчиталось и пока все сносно работает, просто потому что все держится на 0.1 - 10/сек и новых нету ... Т.е. вместо 3-20к там столько, сколько записывается т.к. больше не для чего считать... Ну или я могу сделать рестарт и начать заново, т.к. это не проблема в принципе ...

    Но что касается MyISAM это ужасно, просто по сравнению с SDD все просто летает =( А альтернатив нет? Ну другие free субд, я уже готов все просто переписать чтобы не отказаться от MEMORY этих ... Это как то глупо - мне дали супер скорость и тут же ее забрали, даже не дали попробовать как это работает =/
  • Как использовать Where,Select в для такого случая?

    iamserge
    @iamserge Автор вопроса
    Еще пробую это прямо из БД достатать так, т.к. есть синтаксис для c# схожий с SQL, но однако получив просто ключи далее не могу понять как мне их в этом же запросе использовать и по каждому вести подсчет ... То есть самый бестолковый способ тут это получив ключи начать по каждому делать запрос отдельно ... Но это однако очень много запросов ресурсоемких, ...

    SELECT distinct (eventSTART -eventEND )/1000, ???? FROM event_history.ae_2019;
  • C# и OutOfmemoryExtension - как перейти на полноценные 64х?

    iamserge
    @iamserge Автор вопроса
    Роман, Спс, а ведь и правда есть такой список =/
  • C# и OutOfmemoryExtension - как перейти на полноценные 64х?

    iamserge
    @iamserge Автор вопроса
    Василий Банников, ок, спасибо :) Когда я отойду от перманентного блаженства от того что все работает то пожалуй посмотрю на это серьезнее. Но пока ознакомлюсь все таки ...
  • C# и OutOfmemoryExtension - как перейти на полноценные 64х?

    iamserge
    @iamserge Автор вопроса
    Василий Банников, Уже прямо сейчас? А мне дорого оно обойдется? Я бы и просто конфиг бы не поленился поправить ... Хотя кажется уже поправлен иначе как объяснить словарики что были под 5-6Гб после снятия заклятой галочки. Может быть именно она и помогла мне с этим
  • C# и OutOfmemoryExtension - как перейти на полноценные 64х?

    iamserge
    @iamserge Автор вопроса
    Василий Банников,
    3. На самом деле именно по размеру он скромный. Всего то 60М записей, а в int аж 2Млрд. Столько у меня слава богу нету)
    4. Ох, я тот кто не хочет даже просто это обрабатывать, не то чтобы еще обернуть это красиво и скрыть следы ... DDR4 сейчас дешевый довольно, а возится мне с ними много ...
    5. Собственно файл и там и про Core есть и как будто у меня .net framework и я core тоже подключаю ...
    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
      <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
        <ProjectGuid>{10F57573-3782-4F08-B170-0082BFDD01DF}</ProjectGuid>
        <OutputType>WinExe</OutputType>
        <RootNamespace>FSA</RootNamespace>
        <AssemblyName>FSA</AssemblyName>
        <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
        <FileAlignment>512</FileAlignment>
        <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
        <Deterministic>true</Deterministic>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <PlatformTarget>AnyCPU</PlatformTarget>
        <DebugSymbols>true</DebugSymbols>
        <DebugType>full</DebugType>
        <Optimize>false</Optimize>
        <OutputPath>bin\Debug\</OutputPath>
        <DefineConstants>DEBUG;TRACE</DefineConstants>
        <ErrorReport>prompt</ErrorReport>
        <WarningLevel>4</WarningLevel>
        <Prefer32Bit>false</Prefer32Bit>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
        <PlatformTarget>AnyCPU</PlatformTarget>
        <DebugType>pdbonly</DebugType>
        <Optimize>true</Optimize>
        <OutputPath>bin\Release\</OutputPath>
        <DefineConstants>TRACE</DefineConstants>
        <ErrorReport>prompt</ErrorReport>
        <WarningLevel>4</WarningLevel>
      </PropertyGroup>
      <ItemGroup>
        <Reference Include="MySql.Data, Version=8.0.29.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL" />
        <Reference Include="System" />
        <Reference Include="System.Core" />
        <Reference Include="System.Windows.Forms.DataVisualization" />
        <Reference Include="System.Xml.Linq" />
        <Reference Include="System.Data.DataSetExtensions" />
        <Reference Include="Microsoft.CSharp" />
        <Reference Include="System.Data" />
        <Reference Include="System.Deployment" />
        <Reference Include="System.Drawing" />
        <Reference Include="System.Net.Http" />
        <Reference Include="System.Windows.Forms" />
        <Reference Include="System.Xml" />
      </ItemGroup>
      <ItemGroup>
        <Compile Include="Form1.cs">
          <SubType>Form</SubType>
        </Compile>
        <Compile Include="Form1.Designer.cs">
          <DependentUpon>Form1.cs</DependentUpon>
        </Compile>
        <Compile Include="Program.cs" />
        <Compile Include="Properties\AssemblyInfo.cs" />
        <EmbeddedResource Include="Form1.resx">
          <DependentUpon>Form1.cs</DependentUpon>
        </EmbeddedResource>
        <EmbeddedResource Include="Properties\Resources.resx">
          <Generator>ResXFileCodeGenerator</Generator>
          <LastGenOutput>Resources.Designer.cs</LastGenOutput>
          <SubType>Designer</SubType>
        </EmbeddedResource>
        <Compile Include="Properties\Resources.Designer.cs">
          <AutoGen>True</AutoGen>
          <DependentUpon>Resources.resx</DependentUpon>
        </Compile>
        <None Include="Properties\Settings.settings">
          <Generator>SettingsSingleFileGenerator</Generator>
          <LastGenOutput>Settings.Designer.cs</LastGenOutput>
        </None>
        <Compile Include="Properties\Settings.Designer.cs">
          <AutoGen>True</AutoGen>
          <DependentUpon>Settings.settings</DependentUpon>
          <DesignTimeSharedInput>True</DesignTimeSharedInput>
        </Compile>
      </ItemGroup>
      <ItemGroup>
        <None Include="App.config" />
      </ItemGroup>
      <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    </Project>
  • C# и OutOfmemoryExtension - как перейти на полноценные 64х?

    iamserge
    @iamserge Автор вопроса
    Спасибо. А ммм... где посмотреть в самой среде? Т.е. оно у меня в исходниках ... Вроде бы не должно быть секретом для меня заголовки моего же приложения ...

    p.s. Диспетчер его точно не считае 32 битным
  • C# и OutOfmemoryExtension - как перейти на полноценные 64х?

    iamserge
    @iamserge Автор вопроса
    1. Да целевая точно x64 и памяти много, т.е. этот пункт - ОК
    2. Повсеместно использую Int64 если речь об этом ...
    3. Она плавает, ну то есть это не одно место конкретное - почти каждый раз новое (видимо там где память по факту кончалась)
    4. Именно этого хочу все меньше, даже думаю сделать себе +128GB еще просто чтобы не заниматья обслуживанием этих "кусочков" т.е. помнить где остановился и писать всякое лишнее
    5. Обязательно перепроверю, т.к. сейчас чудо исполняется до сих пор и работает уже второй час как - но и понять где я и с чем мне не помешает. Не отличаю на слух core от framework на самом деле =)

    VS на самом деле съела 1,7Gb и вроде как держится в рамках, хотя и трудно следить за ней вечно т.к. процесс долгий. Просто я так понял что она тоже может съесть много при запуске из нее, если приложение прожорливое - хз зачем, может как раз чтобы ошибки искать ...

    dotMemory - ок попробую и его. Но кажется сами настройки приложения в VS исчерпаны и о боже мой кажется на этом все мои беды кончаются, по крайней мере сейчас ...
  • Blogger и xml "база данных" - как это может работать?

    iamserge
    @iamserge Автор вопроса
    rPman, iframe я забыл когда последний раз использовал если честно, даже не думал об этом ... Но все равно спасибо, мало ли что может пригодиться
  • Blogger и xml "база данных" - как это может работать?

    iamserge
    @iamserge Автор вопроса
    rPman, Ого. А можно поподробнее про 8х/3х ... О каких форматах идет речь? Разница уж больно заметная между ними ...