Halo semuanya! Ini Anton Bashirov, pengembang dari klaster IT Rostelecom. Substitusi impor mendapatkan momentum, dan perangkat lunak Rusia menembus lebih dalam dan lebih dalam ke esensi kehidupan sehari-hari kita yang serba IT. Prosesor Elbrus dan Baikal menjadi lebih diminati, komunitas berkembang, tetapi pemikiran tentang perlunya port seluruh tumpukan teknologi kita yang tercinta ke arsitektur E2K yang belum dijelajahi terdengar lebih buruk daripada cerita tentang kluster produksi yang terbakar.
Bekerja di tim implementasi Elbrus, saya memiliki kesempatan untuk secara harfiah dan kiasan menyentuh prosesor domestik kami, jadi saya ingin berbagi pengalaman saya, berbicara tentang ambang batas rasa sakit apa yang diperlukan untuk menahan porting basis data asli NoSql dan tidak menjadi gila, dan juga untuk kenalkan pengembang dengan dunia Elbrus dan penghuninya.
Jadi, tamu di studio adalah database Reindexer, pengembangan cluster IT kami.
Patut dikatakan mengapa pilihan jatuh pada Reindexer, dan bukan database lain. Pertama, Postgres favorit dan terkenal semua orang sudah termasuk dalam paket Elbrus OS. Tidak perlu mentransfernya. Kedua, tamu kami telah lulus tes pada ARM, oleh karena itu, saatnya baginya untuk menaklukkan Elbrus.
Perlu disebutkan bahwa Reindexer lahir sebagai pilihan antara Elastic dan Tarantool . Saya pasti ingin mencoba memulainya di prosesor domestik.
Hari 0. Bertemu dengan tamu
Beberapa kata tentang tamu kami:
: 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% , . - , . , .
, , , !