security, performance: pick one · 7/4/2018 localhost:8000/slides-light.html?print-pdf 3/44 who...

44
7/4/2018 localhost:8000/slides-light.html?print-pdf http://localhost:8000/slides-light.html?print-pdf 1/44 SECURITY, PERFORMANCE: PICK ONE ? SECURITY, PERFORMANCE: PICK ONE ? Pierre Chifflier @pollux7 1

Upload: others

Post on 01-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 1/44

SECURITY, PERFORMANCE: PICK ONE ?SECURITY, PERFORMANCE: PICK ONE ?Pierre Chifflier

@pollux7

1

Page 2: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 2/44

WHATWHATDefensive/Secure programmingNeeded for many programs

Web servers, IDS

O�en rejected for perf reasons

We want performance and security

And something we can maintain over time

2

Page 3: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 3/44

WHOWHODebian Developer, Suricata contributorHead of the Detection Research lab at ANSSISecurity, compilers and languagesWrite (rust) parsers for everything

3

Page 4: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 4/44

DISCLAIMERDISCLAIMERThis talk is my story, not a guide

Could be “story of a fight vs the compiler”Still, there are general rules/hints

4

Page 5: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 5/44

CHOOSING A LANGUAGECHOOSING A LANGUAGESometimes C is not the answer

You will always fail somewhereBelieve me, I’ve tried

Parts in assemblyCould be fast, but a nightmare to maintain

OCaml, Go, …The perf-killer garbage collector

5

Page 6: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 6/44

EXAMPLE: PARSING KERBEROSEXAMPLE: PARSING KERBEROSKDC-REQ-BODY ::= SEQUENCE {

kdc-options [0] KDCOptions,

cname [1] PrincipalName OPTIONAL

-- Used only in AS-REQ --,

realm [2] Realm

-- Server's realm

-- Also client's in AS-REQ --,

sname [3] PrincipalName OPTIONAL,

from [4] KerberosTime OPTIONAL,

till [5] KerberosTime,

rtime [6] KerberosTime OPTIONAL,

nonce [7] UInt32,

etype [8] SEQUENCE OF Int32 -- EncryptionType

-- in preference order --,

addresses [9] HostAddresses OPTIONAL,

enc-authorization-data [10] EncryptedData OPTIONAL

-- AuthorizationData --,

additional-tickets [11] SEQUENCE OF Ticket OPTIONAL

-- NOTE: not empty

6

Page 7: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 7/44

ASN.1 DER ENCODINGASN.1 DER ENCODINGThe 9 layers of DER Hell

Lots of TLVsHighly recursiveInfinite size integersVariable lengths

Ex: ASN.1 DigestInfo

30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20 XXXXXXXXXXXXXXXXXXXX

Tag Length

30 ( SEQUENCE) 31

Tag Length

30 ( SEQUENCE) 0d

Tag Length

06 ( OID) 09

OID

60 86 48 01 65 03 04 02 01

Tag Length

05 ( NULL) 00

Tag Length

04 ( OCTET STRING) 20

octet string ( SHA - 256 hash)

XXXXXXXXXXXXXXXXXXXX

7

Page 8: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 8/44

WRITING PARSERS IS HARDWRITING PARSERS IS HARD

(source: Google OSS-Fuzz)

8

Page 9: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 9/44

RUSTRUSTCompatible with CType safetyMemory safety: non uninitialized values,etc.Thread safety: forces you to protect (lock)concurrent accessNote: integer overflow/underflow stillpossible

9

Page 10: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 10/44

RUST SPEEDRUST SPEEDFast, but not enoughCan we do better

Keeping safetyKeeping some readability

10

Page 11: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 11/44

MANDATORY WARNINGMANDATORY WARNINGFirst rule: don’t optimizeDon’t bother one-timeoptimizations

11

Page 12: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 12/44

METHODOLOGYMETHODOLOGYFirst: identifying slow pointsUse available toolscargo bench

perf, valgrindflamegraph

One eye on the source codeAlso look at the produced binary code

12

Page 13: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 13/44

ACTION 1: SOURCE CODEACTION 1: SOURCE CODEAlgorithms firstZero-copy

Made possible thanks to slicesNon-locking code

Borrow-checker and non-mutability help a lot

13

Page 14: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 14/44

SLICESSLICES

14

Page 15: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 15/44

RESULT 1RESULT 1messages of 305 bytes1856 ns / message -> 156 MB/s (per thread)Fast, but we want more

15

Page 16: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 16/44

ADDING INSTRUMENTATION: STEP 1ADDING INSTRUMENTATION: STEP 1Add to Cargo.toml:

[profile.release]

debug = true

[profile.bench]

debug = true

16

Page 17: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 17/44

STEP 2: ADD BENCHMARKSSTEP 2: ADD BENCHMARKSAdd a benchmark (benches/b_krb5_parser.rs):

static KRB5_TICKET: &'static [u8] = include_bytes!("../assets/krb5-ticket.bin");

#[bench]

fn bench_parse_ticket(b: &mut Bencher) {

b.iter(|| {

let res = parse_krb5_ticket(KRB5_TICKET);

// use result !

match res {

Ok((rem,tkt)) => {

assert!(rem.is_empty());

assert_eq!(tkt.tkt_vno, 5);

},

_ => assert!(false),

}

});

}

17

Page 18: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 18/44

STEP 3: COLLECT INSTRUMENTATIONSTEP 3: COLLECT INSTRUMENTATIONRESULTSRESULTS

Build the benchmark executable

Use valgrind on it:

cargo bench --no-run

valgrind --tool=callgrind \

--dump-instr=yes --collect-jumps=yes --simulate-cache=yes \

./target/release/b_krb5_parser-e84a853b88e37bef --bench bench_parse_ticket

18

Page 19: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 19/44

PERFORMANCE GRAPHSPERFORMANCE GRAPHS

19

Page 20: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 20/44

WHY IS IT SLOW ?WHY IS IT SLOW ?Parts of the code are slow

too many testsuseless data copy

Some structures do not fit in cache

20

Page 21: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 21/44

ACTION 2: LOOK AT PRODUCED CODEACTION 2: LOOK AT PRODUCED CODEGoal: try to identify and use efficient patternsCan bring huge speed improvementsTime consumingHard to find stable optimization patterns

21

Page 22: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 22/44

COMPILER IS YOUR FRIEND .. OR NOTCOMPILER IS YOUR FRIEND .. OR NOT

22

Page 23: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 23/44

EXAMPLE: READING AN U64EXAMPLE: READING AN U64let u = (i[0] as u64) << 7 |

(i[1] as u64) << 6 |

(i[2] as u64) << 5 |

(i[3] as u64) << 4 |

(i[4] as u64) << 3 |

(i[5] as u64) << 2 |

(i[6] as u64) << 1 |

(i[7] as u64);

23

Page 24: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 24/44

EXAMPLE: READING AN U64EXAMPLE: READING AN U64

8 length tests

24

Page 25: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 25/44

TEST #1: REORDERINGTEST #1: REORDERING

Read last bytes first

let u =

(i[7] as u64) |

(i[6] as u64) << 1 |

(i[5] as u64) << 2 |

(i[4] as u64) << 3 |

(i[3] as u64) << 4 |

(i[2] as u64) << 5 |

(i[1] as u64) << 6 |

(i[0] as u64) << 7;

25

Page 26: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 26/44

TEST #1: REORDERINGTEST #1: REORDERING

Better, but we still have a panic statement

26

Page 27: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 27/44

TEST #2: ASSERTING/TESTING SIZETEST #2: ASSERTING/TESTING SIZE

Compiler uses the info from the testNo need to reorder

if i.len() < 8 { return 0; }

let u = (i[0] as u64) << 7 |

(i[1] as u64) << 6 |

(i[2] as u64) << 5 |

(i[3] as u64) << 4 |

(i[4] as u64) << 3 |

(i[5] as u64) << 2 |

(i[6] as u64) << 1 |

(i[7] as u64);

27

Page 28: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 28/44

TEST #2: ASSERTING/TESTING SIZETEST #2: ASSERTING/TESTING SIZE

28

Page 29: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 29/44

LESSONS FROM THAT EXAMPLELESSONS FROM THAT EXAMPLECompiler is smartBut not enough to infer all informationSometimes adding code makes result faster

Some tests/asserts have to be explicitWe can get efficient code without using unsafe or assembly

29

Page 30: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 30/44

SOME OTHER TIPSSOME OTHER TIPS

30

Page 31: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 31/44

PACKED ENUMSPACKED ENUMSRepresenting a packed enum:

However:

match is slowconversions to/from u8 are implemented as either

function calls (slow)memory casts (unsafe)

#[repr(u8)]

pub enum Foo {

Value1 = 1,

Value2 = 2,

...

31

Page 32: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 32/44

THE NEWTYPE PATTERNTHE NEWTYPE PATTERN

Type-safe, cost-free abstractionFree conversions

except if you forget the pub keyword!Compile time increasesValues have to be declared as associated constants

pub struct Foo(pub u8);

impl Foo {

pub const Value1 : Foo = Foo(1);

32

Page 33: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 33/44

ALLOCATIONSALLOCATIONSAllocations are slowPrefer the stack

Avoid Box and VecYou can use variable-length data-types on stackDrawback: calls to memcpy

33

Page 34: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 34/44

STRUCTURESSTRUCTURESKeep as much as possible in cache

Use small structsMake sure they fit in cache

Check using valgrind

34

Page 35: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 35/44

CODECODEKeep as much as possible in cacheKeep as much as possible in registersUse reentrant, pure functions (no side-effects)Avoid locks and global structures

locks are slow!

35

Page 36: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 36/44

CODECODEWrite linear code

Avoid instructions cache missesnom helps a lot (macros)

Possible problem: cyclomatic complexitywarning: the function has a cyclomatic complexity of 231

--> src/krb5_parser.rs:303:1

36

Page 37: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 37/44

AUTOMATIC VECTORIZATIONAUTOMATIC VECTORIZATION

Code is not vectorized:

let len = min(min(a.len(), b.len()), c.len());

for i in 0..len {

c[i] = a[i] + b[i];

}

cmp rsi, r10

jae .LBB0_7

cmp rsi, rcx

jae .LBB0_8

cmp rsi, r9

jae .LBB0_9

mov eax, dword ptr [rdi + 4*rsi]

add eax, dword ptr [rdx + 4*rsi]

mov dword ptr [r8 + 4*rsi], eax

lea rax, [rsi + 1]

mov rsi, rax

...

37

Page 38: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 38/44

AUTOMATIC VECTORIZATIONAUTOMATIC VECTORIZATION

Code is vectorized:

However:

Make sure instructions apply to blocks of data

let len = min(min(a.len(), b.len()), c.len());

let (a,b,c) = (&a[..len], &b[..len], &mut c[..len]);

for i in 0..len {

c[i] = a[i] + b[i];

}

movdqu xmm0, xmmword ptr [r10 + 4*rsi]

movdqu xmm1, xmmword ptr [r10 + 4*rsi + 16]

movdqu xmm2, xmmword ptr [rdx + 4*rsi]

paddd xmm2, xmm0

movdqu xmm0, xmmword ptr [rdx + 4*rsi + 16]

paddd xmm0, xmm1

...

38

Page 39: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 39/44

MISC PATTERNSMISC PATTERNSAvoid Box<Trait>, prefer &mut Trait

former is 2 pointers (and extra checks)Use iterators

they can spare some more bounds checks

39

Page 40: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 40/44

LINKERLINKERUse LTO (Link-time optimization)

Bigger executable, generally fasterBetter than using #[inline(always)]

Test PGO (Profile-guided optimization)Variable resultsSometimes really good

40

Page 41: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 41/44

CHECKING WE STILL HAVE SECURITYCHECKING WE STILL HAVE SECURITYCompiler is not (always) your friend

Undefined behaviorsInteger underflows/overflowsRemoved in release mode, but can be added

Removed testsRemoved calls (e.g. memset)panic / assert inserted or remaining

Use Compiler Explorer ( )Use cargo fuzz

https://rust.godbolt.org/

41

Page 42: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 42/44

RESULTS (KERBEROS)RESULTS (KERBEROS)

Comparison: my C implem. is ~ 500 MB/s42

Page 43: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 43/44

CODECODEKerberos, SNMP, IKEv2, TLS, Radius, etc.Rusticata project (and all parsers): Rust code push on Most parsers merged in Suricata git repo (4.1 ?)

https://github.com/rusticatacrates.io

43

Page 44: SECURITY, PERFORMANCE: PICK ONE · 7/4/2018 localhost:8000/slides-light.html?print-pdf  3/44 WHO Debian De veloper, Suricata contributor

7/4/2018 localhost:8000/slides-light.html?print-pdf

http://localhost:8000/slides-light.html?print-pdf 44/44

LESSONSLESSONSGuiding the compiler is efficient

And easier to maintain than writingassembly

Always check that the tests are presenta�er optimizing

Are the optimizations stable ?Not guaranteed, but in practise yesSometimes look like voodoo

44