みなさん、こんにちは!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*
.
, 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). , . :
work around - , QueryEntry ExpressionTree, , . , , MakeDeepCopy(), mpark-variant.
2 , variant , , , .
- .
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.
?
reindexer_tool, Reindexer . .
:
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- ):
gestp - %dr3
setwd -
setbn -
addd - "" ( 0x20) %dr2
addd -
ldb - false %r5
stb - false %r5 anyField1
addd -
addd - anyMethod ( anyMethod %dr0)
disp - anyMethod
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% , . - , . , .
, , , !