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*
.
, 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% , . - , . , .
, , , !