L'histoire du portage de Reindexer - comment conquérir l'Elbrouz en 11 jours

Bonjour à tous! Il s'agit d'Anton Bashirov, un développeur du cluster informatique de Rostelecom. La substitution des importations prend de l'ampleur, et les logiciels russes pénÚtrent de plus en plus profondément dans notre essence de vie quotidienne, timide et informatique. Les processeurs Elbrus et Baikal sont de plus en plus demandés, la communauté s'agrandit, mais les réflexions sur la nécessité de porter l'intégralité de notre pile technologique bien-aimée vers l'architecture E2K inexplorée semblent pires que les histoires sur un cluster de production en flammes.





En travaillant dans l'équipe d'implémentation d'Elbrus, j'ai eu l'opportunité de toucher au sens propre et figuré nos processeurs domestiques, je souhaite donc partager mon expérience, parler du seuil de douleur nécessaire pour supporter le portage de la base de données native NoSql et ne pas devenir fou, et aussi pour familiariser les développeurs avec le monde d'Elbrouz et de ses habitants.





Ainsi, l'invité du studio est la base de données Reindexer, le développement de notre cluster informatique.





Cela vaut la peine de dire pourquoi le choix s'est porté sur Reindexer, et non sur une autre base de données. PremiÚrement, le Postgres préféré et bien connu de tous est déjà inclus dans les packages Elbrus OS. Il n'est pas nécessaire de le transférer. DeuxiÚmement, notre invité a déjà passé des tests sur ARM, il est donc temps pour lui de conquérir l'Elbrouz.





Il convient de mentionner que Reindexer est nĂ© d'un  choix entre Elastic et Tarantool . Je veux vraiment essayer de le dĂ©marrer sur un processeur domestique.





Jour 0. Rencontre avec l'invité

Quelques mots sur notre invité :





: NoSQL in-memory database Reindexer

:  3.1.2

: 

:   @olegator99

: https://github.com/Restream/reindexer

: 

:  – C++, CMake

:- ;

- ++11 C++14;

- .





:- ;

- SQL 500K queries/sec PK ;

- full-text search ( Elastic, );

- server embedded;

- : Go, Java, Rust, .NET, Python, C/C++ ( ) PHP.





? . «»!





1. , ?

, . 8C 6.0.1, CMake.





, ! , – LCC.





, LCC GCC . LCC : gcc -> /opt/mcst/bin/lcc*



.





?

, , . , :





«» . .. « », , . : , , . .





– . . . , , , . LCC – , CPU.  .





, CMake.





, CMakeLists.txt , Reindexer. , , «Write once, run anywhere».





, , . .





– , :





№2:





? —  , CMake, .  make -j8



:





, «» , , /++ .





, Reindexer  __E2K__



  __LCC__



:





:





, messages CMake.





- , CMake , : jump_fcontext



  make_fcontext



. , :





, Reindexer .





, !





, :





# file reindexer_server
reindexer_server: ELF 64-bit LSB executable, MCST Elbrus, version 1 (GNU/Linux
      
      



# file reindexer_tool
reindexer_tool: ELF 64-bit LSB executable, MCST Elbrus, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux.so.2, for GNU/Linux 2.6.33, with debug_info, not stripped
      
      



. -. : reindexer_server reindexer_tool.





. Reindexer, :





  • CMake-;





  • ;





  • ASM .





3. , ,

- , web-ui.





Reindexer.





- :





. i5 .





. (gdb E2K ) CLion, .





Reindexer :





. - free ( free jemalloc). , . :





  1. work around - , QueryEntry ExpressionTree, , . , , MakeDeepCopy(),  mpark-variant.





    expression tree  .





    2 , variant , , , .





    - .





  2. TODO: , . ( mpark-variant e2k):





inline constexpr DECLTYPE_AUTO visit(Visitor &&visitor, Vs &&... vs)

#ifdef E2K //Fix for Elbrus
    -> decltype(detail::visitation::variant::visit_value(lib::forward<Visitor>(visitor),
                                                 lib::forward<Vs>(vs)...))
    {
     return detail::visitation::variant::visit_value(lib::forward<Visitor>(visitor),
                                                 lib::forward<Vs>(vs)...);
    }
#else
    DECLTYPE_AUTO_RETURN(
        (detail::all(
             lib::array<bool, sizeof...(Vs)>{{!vs.valueless_by_exception()...}})
             ? (void)0
             : throw_bad_variant_access()),
        detail::visitation::variant::visit_value(lib::forward<Visitor>(visitor),
                                                 lib::forward<Vs>(vs)...))
#endif
      
      



5. ! 


, , , .





.





, ASM  make_fcontext jump_fcontext



 ?





, ASM Reindexer C++ , - boost/context.





?

– , . :

-

- (suspend)

- , (resume).





, :





  • Libcoro ( C/++)





  • Koishi ( , /++)





  • Boost ( , /++, !)





  • Node-fibers ( NodeJS libcoro)





  • Tarantool (fibers libcoro)





  • Kotlin ( , C++)





  • C++20





  • Goroutine





Koishi:





:





  1. , , ;





  2. - ;





  3.  koishi_yield



     â€“ test1  koishi_resume;







  4.  koishi_resume



      – cofunc1  koishi_yield.







reindexer_tool, Reindexer . .





. , ASM ( ), .  , .





:





  • 1:  ASM . , . , ASM - .





  • 2: . , .





  • 3: .





Koishi , E2K : makecontext_e2k()



  freecontext_e2k()



.





Koishi, Koishi, ?

– , API C/C++ :





  • ucontext





  • ucontext_e2k ( )





  • fcontext





  • win32fiber





  • ucontext_sjlj





  • emscripten





, , .





Koishi Reindexer:





:





, :





backend- Koishi fcontext ( boost , Reindexer). « – !» , E2K .  ucontext_e2k.c







, ( amd64, E2K):





11.

, . .





Reindexer 300 , .





, . Segmentation Fault.





:





struct ConnectOpts {
  /*   ,      */
  uint16_t options = 0;
  int expectedClusterID = -1;
};
      
      



« , ?» – . . , , .





.





ASM,





:





, . , – , Segmentation Fault.





,  addd



. segfault. ,  bool anyField = false



   bool anyField



, .





, – !





. Reindexer LCC v.1.25.16, 1.25.14, . , 15 . 16- , .





LCC v.1.25.16:





C++ , ASM , – ! ( asm- ):





  1. gestp - %dr3





  2. setwd -





  3. setbn -





  4. addd - "" ( 0x20) %dr2





  5. addd -





  6. ldb - false %r5





  7. stb - false %r5 anyField1





  8. addd -





  9. addd - anyMethod ( anyMethod %dr0)





  10. disp - anyMethod





  11. call - anyMethod





– , , .





, Reindexer .





?

. :





  • Reindexer Server





  • Reindexer Server





  • Reindexer Tool





  • Reindexer Tool





  • Reindexer Tool





  • Reindexer





  • 100% Reindexer





:





  • C++





  • C++





  • ASM E2K









  • C++





:





  • ASM E2K ( fcontext ASM i5 ucontext/ASM E2K)





  • Reindexer













  • E2K





?





– . 80% , . - , . , .





, , , !








All Articles