リインデクサーの移植の歴史-11日でエルブルスを征服する方法

みなさん、こんにちは!RostelecomのITクラスターの開発者であるAntonBashirovです。輸入代替が勢いを増しており、ロシアのソフトウェアは私たちの日常のIT-shnyの本質にどんどん深く浸透しています。ElbrusおよびBaikalプロセッサの需要が高まり、コミュニティは拡大していますが、私たちの最愛の技術スタック全体を未踏のE2Kアーキテクチャに移植する必要性についての考えは、炎上するプロダクションクラスターの話よりも悪いように聞こえます。





Elbrus実装チームで働いていたので、文字通りそして比喩的に国内のプロセッサに触れる機会があったので、私の経験を共有し、NoSqlネイティブデータベースの移植に耐えて狂わないようにするために必要な痛みのしきい値について話したいと思います。エルブルスとその住民の世界に精通した開発者。





つまり、スタジオのゲストは、ITクラスターの開発であるReindexerデータベースです。





別のデータベースではなく、Reindexerが選択された理由は言うまでもありません。まず、誰もがお気に入りで有名なPostgresがすでにElbrusOSパッケージに含まれています。転送する必要はありません。第二に、私たちのゲストはすでにARMのテストに合格しているので、エルブルスを征服する時が来ました。





ReindexerはElasticとTarantoolの間選択肢として生まれたことは言及する価値が あります絶対に国産のプロセッサーで始めてみたいです。





0日目。ゲストとの出会い

ゲストについて一言:





: 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