+ All Categories
Home > Documents > Taking Off With Solaris

Taking Off With Solaris

Date post: 26-Feb-2018
Category:
Upload: nguyenhd
View: 220 times
Download: 0 times
Share this document with a friend

of 41

Transcript
  • 7/25/2019 Taking Off With Solaris

    1/41

    TAKING OFF WITHSOLARIS

    Dennis Chernoivanov, Senior Software Engineer at Tbricks

  • 7/25/2019 Taking Off With Solaris

    2/41

    Founded 2006, privately held

    Offices in Stockholm and St.Petersburg, ~25 employees

    Objective: Algorithmic Trading Solution

    Ultra-low latency (under 1ms)

    Highly scalable

    Easy to setup, deploy and manage

    Reliable, through fail-over capabilities

    Zero configuration

    COMPANY OVE VIEW

  • 7/25/2019 Taking Off With Solaris

    3/41

    VENUES

    FIX/FAST

    Strategy Engine

    TradingOrder Updates

    Market Data

    Trades + Position

    Updates

    Integration

    StopOrder

    MarketonClose

    ...

    ...

    C++

    Strategy#1

    Strategy#2

    Strategy#N

    Venues

    T ATEGY ENGINE OVE VIEW

  • 7/25/2019 Taking Off With Solaris

    4/41

    PART I: OS OF CHOICE

  • 7/25/2019 Taking Off With Solaris

    5/41

    Need highly scalable, tuned kernel

    Solaris: > 20 years SMP development, known to perform well

    Linux: Quickly gets up to speed

    Stable API, manageable upgrades

    Solaris: Already there

    Linux: OS version + GLIBC version + ...

    MAKING THE CHOICE

  • 7/25/2019 Taking Off With Solaris

    6/41

    Good 64-bit development tools

    Solaris: SUNWspro, DTrace, ProcUtils, ...

    Linux: GCC/GDB (SystemTap to come)

    Reliable and fast file storage, preferably with backup solution

    Solaris: ZFS

    Fast

    Easy built-in backup through snapshots

    Easy to use, no more RAID nightmares

    Linux: Traditional filesystems and tools

    Predictable scheduler performance and latency

    MAKING THE CHOICE

  • 7/25/2019 Taking Off With Solaris

    7/41

    3 150 000

    3 100 000

    3 050 000

    3 000 000

    2 950 000

    2 900 000

    2 850 000

    2 800 000

    2 750 000

    2 700 000

    2 650 0002 600 000

    2 550 000

    2 500 000

    2 450 000

    2 400 000

    2 350 000

    2 300 000

    2 250 000

    2 200 000

    2 150 000

    2 100 000

    2 050 000

    2 000 000

    1 950 000

    1 900 000

    1 850 000

    1 800 000

    1 750 000

    1 700 000

    1 650 000

    1 600 000

    1 550 000

    1 500 000

    1 450 000

    1 400 000

    1 350 000

    1 300 000

    1 250 000

    1 200 000

    1 150 000

    1 100 0002006-10-06 11:21:39 2006-10-14 02:32:20 2006-10-19

    ops/sec

    Count of operations per second for last 13 daysCount of operations per second for last 13 days

    tmean (t2-t1) SolarisAMD64 Remote tmean (t2-t1) LinuxAMD64 Local tmean (t2-t1) LinuxAMD64 Remote

    Unexpected

    degradation

    Peak1 restart

    Peak2 restart

    MAKING THE CHOICE

  • 7/25/2019 Taking Off With Solaris

    8/41

    Solaris 10/x86_64

    Sun Fire x4150 Server with 2 Quad-core Intel Xeons

    ZFS as an ultimate storage and backup

    EFE ENCE PLATFO M

  • 7/25/2019 Taking Off With Solaris

    9/41

    Solaris/SPARC (T1000)

    Windows/x86

    MacOSX/x86_64 (Leopard 10.5.1)

    Linux/x86_64 (RHEL4 ES)

    AL O IN THE GAME

  • 7/25/2019 Taking Off With Solaris

    10/41

    PART II: BUILD FACTORY

  • 7/25/2019 Taking Off With Solaris

    11/41

    ~500 000 lines of code backed by Subversion

    Servers are in C++

    Client is in C#

    ~150 000 auto-generated C++ code

    Some perl scripts

    Much larger code base is free software sources

    ACE/QuickFIX/... (C++)

    LibXML2/LibXSLT (C/C++)

    CODE BA E

  • 7/25/2019 Taking Off With Solaris

    12/41

    SUN Studio 12

    Optimizes well for SPARC and x86_64

    Sticks to the Standard

    But provokes to use non-standard STL (libCstd.so.1)

    And comes with STLport4 not optimized for x86_64

    COMPILE UITE

    class Any{ ...private:

    union { bool m_boolean; int64_t m_integer; double m_double; } m_value; std::string m_string; // takes an allocator-wide lock bringing the system down // Apaches stdcxx library optimizes this away using atomic ops};

  • 7/25/2019 Taking Off With Solaris

    13/41

    GCC 3.x and 4.x

    Most portable

    Fairly strict

    MS Visual Studio 8

    Fast

    But has issues with portability (how about stdint.h?)

    COMPILE UITE

  • 7/25/2019 Taking Off With Solaris

    14/41

    GNU Make 3.81

    Feature rich

    Supports parallel builds

    Natively builds most of the platforms

    On Windows:

    GNU Make 3.81

    Custom build helper programs

    MPC

    MS VS msbuild and vcbuild as the engine

    BUILD Y TEM

  • 7/25/2019 Taking Off With Solaris

    15/41

    BUILD TIME NF

    Solaris: SunFire x4150 16Gb RAM

    Mac OS X: Apple Xserve Quad-core Xeon 2.66 GHz 4Gb RAM

    Windows: VmWare i386 virtualization box

    $ time tbmake -jreal 8m48.656suser 20m38.300ssys 17m53.620s

    $ time tbmake -jreal 15m13.185suser 38m45.659ssys 9m59.379s

    $ time tbmake -jreal 54m36.624suser 18m46.978ssys 14m59.874s

    $ time tbmake -jreal 94m4.187suser 0m0.015ssys 0m0.093s

    Linux: 2xQuad-core Intel Xeon Harpertown 2.83 GHz 8Gb RAM

  • 7/25/2019 Taking Off With Solaris

    16/41

    Design/Code/Build/Debug

    Commit reviews (untested commits prohibited)

    Automated per-commit, per-component tests

    Full system tests few times a day

    Leaks detection

    Performance inspection

    Memory consumption analysis

    Run-time checks (with Rational tools)

    Test coverage computation

    Static code analysis

    DEVELOPMENT WO KFLOW

  • 7/25/2019 Taking Off With Solaris

    17/41

    13 000

    12 500

    12 000

    11 500

    11 000

    10 500

    10 000

    9 500

    9 000

    8 500

    8 000

    7 500

    7 000

    msec

    6 500

    6 000

    5 500

    5 000

    4 500

    4 000

    3 500

    3 000

    2 500

    2 000

    1 500

    1 0009 018 9 093 9 172 9 210 9 320 9 519 9 622 9 791 9 897 10 124 10 247 10 417 10 539 10 687 10 837 11 006 11 198 11 337 11 505 117 511 181

    revision

    tmean viid_set_id SolarisAMD64 trunk

    viid_set_id [id=185] [revision from 9018 to 12458]T ACKING PE FO MANCE

  • 7/25/2019 Taking Off With Solaris

    18/41

    15% Native Windows development

    55% Windows as a terminal to Solaris/Linux

    25% MacOSX

    5% Linux

    DEVELOPE DE KTOP

  • 7/25/2019 Taking Off With Solaris

    19/41

    50% : ViM

    30% : MS Visual Studio

    20% : Other (Emacs/Xcode/Joe)

    DEVELOPE DE KTOP

  • 7/25/2019 Taking Off With Solaris

    20/41

    Not promoted as a desktop system

    Lacks support from software vendors

    VmWare is of high importance to us

    I want my Firefox 3 RC with Flash plug-in!

    Even configure is not always adopted for Solaris/x86

    Windows is de-facto standard

    Means: You must be better by far to make people move

    NO OLA I

  • 7/25/2019 Taking Off With Solaris

    21/41

    PART III: TOOLS

  • 7/25/2019 Taking Off With Solaris

    22/41

    Non-intrusive

    Very limited performance impact to the traced processes

    Does not require change/build/run cycle

    Provides for process sampling

    Incredible for troubleshooting: Even customers can use it!

    DT ACE

  • 7/25/2019 Taking Off With Solaris

    23/41

    #include "make_uuid.d"

    string strategy_id;

    string parent_id;

    BEGIN

    {

    printf( "\nTracing SE for 'order latency' strategy checking.\n\n");

    start_time = timestamp;

    }

    #define LATENCY_ENTRY(name, display_name, direction) \

    se_latency$target:::name \

    { \

    MAKE_UUID( strategy_id, arg1, arg2); \

    MAKE_UUID( parent_id, arg3, arg4); \

    nsec = timestamp - start_time; \

    sec = nsec / 1000000000; \

    nsec -= sec * 1000000000; \

    msec = nsec / 1000000; \

    nsec -= msec * 1000000; \ usec = nsec / 1000; \

    nsec -= usec * 1000; \

    printf( "[%03d.%03d.%03d.%03d] %04d display_name %s direction %s\n", sec, msec, usec, nsec, arg0, strategy_id, parent_id); \

    }

    LATENCY_ENTRY(Engine_create_strategy,create_strategy,)

    LATENCY_ENTRY(SH_HSI_execute,call_h_strategy,->)

    BBO LATENCY

  • 7/25/2019 Taking Off With Solaris

    24/41

    [cdi@k2(pts/3) ~/src/tb/trunk/src/scripts/dtrace]$ dtrace -CqI /home/german/trunk/src/scripts/dtrace -s /home/german/trunk/src/scripts/dtrace/se_order_latency.d -P se_latency\* -p 3289

    Tracing SE for 'order latency' strategy checking.

    [052.569.044.552] 0000 handle_strategy 2950c08a-36f8-11dd-97a5-09d0a6796c37 -> 8ddd9ac6-5003-4e42-bff9-0c499a4fadc5

    [052.511.740.421] 0000 create_strategy 2950c08a-36f8-11dd-97a5-09d0a6796c37 8ddd9ac6-5003-4e42-bff9-0c499a4fadc5

    BBO LATENCY

  • 7/25/2019 Taking Off With Solaris

    25/41

    [cdi@k2(pts/3) ~/src/tb/trunk/src/scripts/dtrace]$ dtrace -Cqs ./storage.d 3289Tracing BDB database calls every 10 seconds.

    Call count during last 10 seconds:

    StorageBDBBackend::put() 1 StorageBDBBackend::BDBCursor::get() 3

    StorageBDBBackend::BDBCursor::BDBCursor() 6

    StorageBDBBackend::BDBCursor::~BDBCursor() 6

    Total summary:

    Total number of calls (count):

    ================================================================================

    total StorageBDBBackend::modify() 2 total StorageBDBBackend::BDBCursor::get() 3

    total StorageBDBBackend::put() 5

    total StorageBDBBackend::BDBCursor::BDBCursor() 6 total StorageBDBBackend::BDBCursor::~BDBCursor() 6

    Average time spent in each call (microseconds):

    ================================================================================

    StorageBDBBackend::BDBCursor::get() 4

    BDBCursor open close 69 StorageBDBBackend::put() 319

    StorageBDBBackend::modify() 351

    DT ACE: I O AMPLING

  • 7/25/2019 Taking Off With Solaris

    26/41

    31 000

    30 000

    28 000

    27 000

    26 000

    25 000

    24 000

    23 00022 000

    21 000

    20 000

    19 000

    18 000

    17 000

    16 000

    15 000

    14 000

    13 000

    12 000

    11 000

    10 000

    9 000

    8 000

    7 000

    6 000

    5 000

    4 000

    3 000

    2 000

    1 000

    10 20 30 40 50 60 70 80 90 100 110 120

    0

    29 000

    unit

    sec

    xIcelerg call-count (handle_output) in last 10 seconds [id=124]DT ACE: I O AMPLING

  • 7/25/2019 Taking Off With Solaris

    27/41

    Documentation

    No inter-process tracing (or at least gettimeofday() call)

    TCP/IP checkpoints [tcpsnoop not integrated for ~2 years]

    Static checkpoint signature length limited to 128 characters

    Limited D syntax (only integral types for local variables)

    No distributed measurements

    WHAT MI ING

  • 7/25/2019 Taking Off With Solaris

    28/41

    Trading VenuesStrategy

    Engine

    Market Data

    Snooper

    t1

    t2

    TB NOOPE AMPLING

  • 7/25/2019 Taking Off With Solaris

    29/41

    1 250

    1 200

    1 150

    1 100

    1 050

    1 000

    950

    900

    850

    800

    750

    700

    650

    600

    550

    500

    450

    400

    350

    300

    250

    200

    150

    100

    10 645 10 672 10 734 10 837 10 936 11 006 11 067 11 172 11 267 11 337 11 432 11 505 11 53750

    revision

    usec

    tmean latency (all) mos SolarisAMD64 trunk

    tmean latency (market place) mos SolarisAMD64 trunk

    tmean latency (trading) mos SolarisAMD64 trunk

    tmean latency (market data) mos SolarisAMD64 trunk

    tmean latency (se+sm) mos SolarisAMD64 trunk

    TB-1499 Latency MOS (tmean) [id=58] [revision from 10645 to 12453]

    LATENCY T ACKING

  • 7/25/2019 Taking Off With Solaris

    30/41

    Script syntax close to C (ifs, cycles, and more)

    TCP/IP checkpoints built-in

    No user-level checkpoints yet

    IVAL : Y TEMTAP LINUX

  • 7/25/2019 Taking Off With Solaris

    31/41

    Provides object-caching memory allocator

    Fast (SE developer has no more fear for operator new)

    Designed for use in multi-threaded applications

    Built-in leaks detection

    Built-in memory corruption detection

    LIBUMEM

  • 7/25/2019 Taking Off With Solaris

    32/41

    MacOSX Leaks: Much easier to use

    Valgrind

    Memory error detection

    Memory consumption analysis (even if reference is kept)

    Heap profiler

    Very good documentation

    Easy to use

    ANYTHING EL E OUT THE E

  • 7/25/2019 Taking Off With Solaris

    33/41

    $ export UMEM_DEBUG=default $ export UMEM_LOGGING=transaction

    $ export LD_PRELOAD=libumem.so.1

    $ echo "::findleaks" | mdb -p

    BYTES LEAKED VMEM_SEG CALLER4096 1 fffffd7ffbca9000 MMAP

    ------------------------------------------------------------------------ Total 1 oversized leak, 4096 bytes

    CACHE LEAKED BUFCTL CALLER00000000008e6668 12 0000000003961d20 libCrun.so.1__1c2n6FL_pv_+0x29

    00000000008f1028 2 000000000273b7e0 libdb_cxx-4.6.so`__os_malloc+0x9a

    00000000008d4028 260 00000000025f02a0 libtypes.so`__1cHtbricksFtypesKDictionaryJget_value6Fr2Lpkv_i_+0x2a

    $ echo "0000000003961d20$

  • 7/25/2019 Taking Off With Solaris

    34/41

    $ export MallocStackLogging=1

    $ leaks

    Leak: 0x1030b9600 size=4608

    0x00001050 0x00000000 0x00000000 0x00000000 P............... 0x0000002d 0x00000000 0xffffffff 0xffffffff -...............

    0x01682048 0x00000000 0x00000001 0x00000000 H h............. 0x0498db78 0x00000001 0x00000000 0x00000000 x...............

    0xffffffff 0xffffffff 0xffffffff 0xffffffff ................

    0x00000000 0x00000001 0x00000001 0x00000000 ................ 0x00000000 0x10000000 0x00000501 0x00000000 ................

    0x00000001 0x00000000 0x00000000 0x00000000 ................ ...

    Call stack: [thread 0x1050a5000]: | thread_start | _pthread_start | ace_thread_adapter | ACE_Thread_Adapter::invoke() |ACE_Thread_Adapter::invoke_i() | ACE_Task_Base::svc_run(void*) | Task::svc() | strategy_storage::GetSnapshot::execute() |strategy_storage::StorageTask::get_snapshot(tbricks::types::UUID const&, tbricks::filter::Filter const&) |tbricks::storage::MessageStorageT

  • 7/25/2019 Taking Off With Solaris

    35/41

    For its scalable and tuned kernel

    Stable API and manageable upgrades

    Reliable scheduler

    Compilers that are so standard compliant

    ZFS

    Runtime analysis tools

    O, WE DELIVE ON OLA I

  • 7/25/2019 Taking Off With Solaris

    36/41

    For its faster builds

    And its just faster (at least when not overused)

    Because it has better support from software vendors

    BUT WE UN LINUX

  • 7/25/2019 Taking Off With Solaris

    37/41

    As it has extremely easy to use analysis tools

    Quite easy to setup an use

    Of course, religion issues

    AND MAC O X

  • 7/25/2019 Taking Off With Solaris

    38/41

    Because C# makes GUI development blazingly fast

    De-facto standard for desktop computing

    AND WINDOW

  • 7/25/2019 Taking Off With Solaris

    39/41

    Documentation

    Performance

    Faster feature turnaround times

    User friendliness

    More interaction with software vendors (e.g. market API)

    More hypes about the platform

    WHAT CAN WE A K FO

  • 7/25/2019 Taking Off With Solaris

    40/41

    Dennis ChernoivanovSenior Software Engineer at Tbricks

    [email protected]

    www.tbricks.com

  • 7/25/2019 Taking Off With Solaris

    41/41


Recommended