SlideShare a Scribd company logo
1 of 55
Download to read offline
Faster IO through io uring_uring
Jens Axboe
Software Engineer, Facebook Kernel Recipes 2019, Sep 26th
2019
Facebook 3
• read(2) / write(2)
• pread(2) / pwrite(2)
• preadv(2) / pwritev(2)
• preadv2(2) / pwritev2(2)
• fsync(2) / sync_data_range(2)
Rewind one year...
Facebook 4
• io_setup(2) → io_submit(2) → io_getevents(2)
• Supports read/write, poll, fsync
• Buffered? lol
• O_DIRECT always asynchronous? Nope
• Efficiency
●
System calls
●
Copy
●
Ring buffer
●
Overall performance lacking today
Rewind one year aio/libaio… aio/libaio
Facebook 5
• Limited, O_DIRECT is fairly niche
• Which leads to…
commit 84c4e1f89fefe70554da0ab33be72c9be7994379
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date: Sun Mar 3 14:23:33 2019 -0800
aio: simplify - and fix - fget/fput for io_submit()
Adoption
Facebook 6
• Support for missing features
●
Buffered async IO
●
Polled IO
●
New features that allow general overhead reduction
• API that doesn’t suck
• Efficient
●
Low latency
●
High IOPS
●
System call limiting
• Could aio be fixed?
What do we need - tldr
Facebook 7
• Yes, I know what it sounds like…
• Merged in v5.1-rc1
●
First posted January 8th
2019
●
Merged March 8th
2019
• So obviously Linus totally loves it
io uring_uring
Facebook 8
“So honestly, the big issue is that this is *YET*
another likely failed interface that absolutely
nobody will use, and that we will have
absolutely zero visibility into.”
Linus
Facebook 9
“It will probably have subtle and nasty bugs, not
just because nobody tests it, but because that's
how asynchronous code works - it's hard.”
Linus
Facebook 10
“And they are security issues too, and they'd
never show up in the one or two actual users we
might have (because they require that you race
with closing the file descriptor that is used
asynchronously).”
Linus
Facebook 11
“Or all the garbage direct-IO crap. It's shit. I
know the XFS people love it, but it's *still*
shit.”
Linus
Facebook 12
Hopeless?
Facebook 13
“So the fundamental issue is that it needs to be
so good that I don't go "why isn't this *exactly*
the same as all the other failed clever
things we've done"?”
Linus
Facebook 14
• Yes, I know what it sounds like…
• Merged in v5.1-rc1
●
First posted January 8th
2019
●
Merged March 8th
2019
• So obviously Linus totally loves it
●
Deep down somewhere…
io uring_uring
Facebook 15
• Fundamentally, ring based communication channel
●
Submission Queue, SQ
●
struct io_uring_sqe
●
Completion Queue, CQ
●
struct io_uring_cqe
• All data shared between kernel and application
• Adds critically missing features
• Aim for easy to use, while powerful
●
Hard to misuse
• Flexible and extendable!
What is it
Facebook 16
• int io_uring_setup(u32 nentries, struct io_uring_params *p);
●
→ returns ring file descriptor
struct io_uring_params {
__u32 sq_entries;
__u32 cq_entries;
__u32 flags;
__u32 sq_thread_cpu;
__u32 sq_thread_idle;
__u32 features;
__u32 resv[4];
struct io_sqring_offsets sq_off;
struct io_cqring_offsets cq_off;
};
Ring setup
Facebook 17
struct io_sqring_offsets {
__u32 head;
__u32 tail;
__u32 ring_mask;
__u32 ring_entries;
__u32 flags;
__u32 dropped;
__u32 array;
__u32 resv1;
__u64 resv2;
};
Facebook 18
#define IORING_OFF_SQ_RING 0ULL
#define IORING_OFF_CQ_RING 0x8000000ULL
#define IORING_OFF_SQES 0x10000000ULL
sq→ring_ptr = mmap(0, sq→ring_sz, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_POPULATE, ring_fd,
IORING_OFF_SQ_RING);
sq→khead = sq→ring_ptr + p→sq_off.head;
sq→ktail = sq→ring_ptr + p→sq_off.tail;
[…]
Ring access
Facebook 19
• head and tail indices free running
●
Integer wraps
●
Entry always head/tail masked with ring mask
• App produces SQ ring entries
●
Updates tail, kernel consumes at head
●
→array[] holds index into →sqes[]
●
Why not directly indexed?
• Kernel produces CQ ring entries
●
Updates tail, app consumes at head
●
→cqes[] indexed directly
Reading and writing rings
Facebook 20
struct io_uring_sqe {
__u8 opcode; /* type of operation for this sqe */
__u8 flags; /* IOSQE_ flags */
__u16 ioprio; /* ioprio for the request */
__s32 fd; /* file descriptor to do IO on */
__u64 off; /* offset into file */
__u64 addr; /* pointer to buffer or iovecs */
__u32 len; /* buffer size or number of iovecs */
union {
__u32 misc_flags;
};
__u64 user_data; /* data to be passed back at completion time */
};
SQEs
Facebook 21
struct io_uring_sqe *sqe;
unsigned index, tail;
tail = ring->tail;
read_barrier();
/* SQ ring full */
if (tail + 1 == ring->head)
return FULL;
index = tail & ring->sq_ring_mask;
sqe = &ring->sqes[index];
/* fill in sqe here */
ring->array[index] = index;
write_barrier();
ring->tail = tail + 1;
write_barrier();
Filling in a new SQE
Facebook 22
struct io_uring_cqe {
__u64 user_data; /* sqe->data submission passed back */
__s32 res; /* result code for this event */
__u32 flags;
};
CQEs
Facebook 23
struct io_uring_cqe *cqe;
unsigned head, index;
head = ring->head;
do {
read_barrier();
/* cq ring empty */
if (head == ring->tail)
break;
index = head & ring->cq_ring_mask;
cqe = &ring->cqes[index];
/* handle done IO */
head++;
} while (1);
ring->head = head;
write_barrier();
Finding completed CQE
Facebook 24
• int io_uring_enter(int ring_fd, u32 to_submit,
u32 min_complete, u32 flags,
sigset_t *sigset);
#define IORING_ENTER_GETEVENTS (1U << 0)
#define IORING_ENTER_SQ_WAKEUP (1U << 1)
• Enables submit AND complete in one system call
• Non-blocking
• Requests can be handled inline
Submitting and reaping IO
Facebook 25
#define IORING_OP_NOP 0
#define IORING_OP_READV 1
#define IORING_OP_WRITEV 2
#define IORING_OP_FSYNC 3
#define IORING_OP_READ_FIXED 4
#define IORING_OP_WRITE_FIXED 5
#define IORING_OP_POLL_ADD 6
#define IORING_OP_POLL_REMOVE 7
#define IORING_OP_SYNC_FILE_RANGE 8
#define IORING_OP_SENDMSG 9
#define IORING_OP_RECVMSG 10
#define IORING_OP_TIMEOUT 11
Supported operations
Facebook 26
• Only two hard problems in computer science
1) Cache invalidation
2) Memory ordering
3) Off-by-one errors
I thought you said “easy to use”..?
Facebook 27
• Helpers for setup
liburing to the rescue
Facebook 28
static int setup_ring(struct submitter *s)
{
struct io_sq_ring *sring = &s->sq_ring;
struct io_cq_ring *cring = &s->cq_ring;
struct io_uring_params p;
int ret, fd;
void *ptr;
memset(&p, 0, sizeof(p));
fd = io_uring_setup(depth, &p);
if (fd < 0) {
perror("io_uring_setup");
return 1;
}
s->ring_fd = fd;
ptr = mmap(0, p.sq_off.array + p.sq_entries * sizeof(__u32),
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, fd,
IORING_OFF_SQ_RING);
printf("sq_ring ptr = 0x%pn", ptr);
sring->head = ptr + p.sq_off.head;
sring->tail = ptr + p.sq_off.tail;
sring->ring_mask = ptr + p.sq_off.ring_mask;
sring->ring_entries = ptr + p.sq_off.ring_entries;
sring->flags = ptr + p.sq_off.flags;
sring->array = ptr + p.sq_off.array;
sq_ring_mask = *sring->ring_mask;
s->sqes = mmap(0, p.sq_entries * sizeof(struct io_uring_sqe),
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, fd,
IORING_OFF_SQES);
printf("sqes ptr = 0x%pn", s->sqes);
ptr = mmap(0, p.cq_off.cqes + p.cq_entries * sizeof(struct io_uring_cqe),
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, fd,
IORING_OFF_CQ_RING);
printf("cq_ring ptr = 0x%pn", ptr);
cring->head = ptr + p.cq_off.head;
cring->tail = ptr + p.cq_off.tail;
cring->ring_mask = ptr + p.cq_off.ring_mask;
cring->ring_entries = ptr + p.cq_off.ring_entries;
cring->cqes = ptr + p.cq_off.cqes;
cq_ring_mask = *cring->ring_mask;
return 0;
}
Facebook 29
#include <liburing.h>
struct io_uring ring;
int ret;
ret = io_uring_queue_init(DEPTH, &ring, 0);
Facebook 30
• Helpers for setup
• Helpers for submitting IO
liburing to the rescue
Facebook 31
static int prep_more_ios(struct submitter *s, int max_ios)
{
struct io_sq_ring *ring = &s->sq_ring;
unsigned index, tail, next_tail, prepped = 0;
next_tail = tail = *ring->tail;
do {
next_tail++;
read_barrier();
if (next_tail == *ring->head)
break;
index = tail & sq_ring_mask;
init_io(s, index);
ring->array[index] = index;
prepped++;
tail = next_tail;
} while (prepped < max_ios);
if (*ring->tail != tail) {
/* order tail store with writes to sqes above */
write_barrier();
*ring->tail = tail;
write_barrier();
}
return prepped;
}
Facebook 32
struct io_uring_sqe *sqe;
struct io_uring_cqe *cqe;
struct iovec iov;
sqe = io_uring_get_sqe(ring); ← previous example to here
iov.iov_base = some_addr;
iov.iov_len = some_len;
io_uring_prep_readv(sqe, ring->fd, &iov, 1 offset);
io_uring_submit(ring);
io_uring_wait_cqe(ring, &cqe);
[read cqe]
io_uring_cqe_seen(ring, cqe);
Facebook 33
• Helpers for setup
• Helpers for submitting IO
●
Eliminates need for manual memory barriers
• Mix and match raw and liburing without issue
• liburing package contains kernel header as well
• Use it! Don’t be a hero
• git://git.kernel.dk/liburing
liburing to the rescue
Facebook 34
• io_uring_queue_{init,exit}();
• io_uring_get_sqe();
• io_uring_prep_{readv,writev,read_fixed,write_fixed}();
io_uring_prep_{recv,send}msg();
io_uring_prep_poll_{add,remove}();
io_uring_prep_fsync();
• io_uring_submit();
io_uring_submit_and_wait();
• io_uring_{wait,peek}_cqe();
• io_uring_cqe_seen{};
• io_uring_{set,get}_data();
liburing at a glance
Facebook 35
• Set IOSQE_IO_DRAIN in sqe→flags
• If set, waits for previous commands to complete
• Eliminates write→write→write, wait for all writes, sync
Feature: Drain flag
Facebook 36
• Form arbitrary length chain of commands
●
“Do this sqe IFF previous sqe succeeds”
• write→write→write→fsync
• read{fileX,posX,sizeX}→write{fileY,posY,sizeY}
●
See liburing examples/link-cp.c
• Set IOSQE_IO_LINK in sqe→flags
●
Dependency chain continues until not set
• Ease of programming, system call reductions
Feature: Linked commands
Facebook 37
• int io_uring_register(int ring_fd, u32 op, void *arg,
u32 nr_args);
#define IORING_REGISTER_BUFFERS 0
#define IORING_UNREGISTER_BUFFERS 1
#define IORING_REGISTER_FILES 2
#define IORING_UNREGISTER_FILES 3
#define IORING_REGISTER_EVENTFD 4
#define IORING_UNREGISTER_EVENTFD 5
Registering aux functions
Facebook 38
• Takes a struct iovec array as argument
●
Length of array nr_args
• Eliminates get_user_pages() in submission path
●
~100 nsec
• Eliminates put_pages() in completion path
• Use with IORING_OP_READ_FIXED, IORING_OP_WRITE_FIXED
●
Not iovec based
●
sqe→buf_index points to index of registered array
●
sqe→addr is within buffer, sqe→len is length in bytes
Registered buffers
Facebook 39
• Takes a s32 array as argument
●
Length of array as nr_args
• Eliminates atomic fget() for submission
• Eliminates atomic fput() for completion
• Use array index as fd
●
Set IOSQE_FIXED_FILE
• Circular references
●
Setup socket, register both ends with io_uring
●
Pass io_uring fd through socket
●
https://lwn.net/Articles/779472/
Registered files
Facebook 40
• Takes a s32 pointer as argument
●
nr_args ignored
• Allows completion notifications
Registered eventfd
Facebook 41
• Not poll(2)
●
Are we there yet?
• Trades CPU usage for latency win
●
Until a certain point
• Absolutely necessary for low latency devices
• Use IORING_SETUP_IOPOLL
• Submission the same, reaping is polled
• Can’t be mixed with non-polled IO
• Raw bdev support (eg nvme), files on XFS
Polled IO
Facebook 42
• Use IORING_SETUP_SQPOLL
●
IORING_SETUP_SQ_AFF
• Submission now offloaded, reaping is app polled
• Independent of IORING_SETUP_IOPOLL
• Busy loops for params→sq_thread_idle msec when idle
●
Sets sq_ring→flags |= IORING_SQ_NEED_WAKEUP
• Allows splitting submit / complete load onto separate cores
Polled IO submission
Facebook 43
NOP
Facebook 44
io uring vs aio peak_uring
Facebook 45
Buffered perf
Facebook 46
io uring vs aio sync_uring
Facebook 47
• Rust, C++ I/O executors
• Ceph (bluestore, new backend)
• libuv
• Postgres
• RocksDB (and MyRocks)
Adoption
Facebook 48
RocksDB MultiRead test() test
Facebook 49
• Rust, C++ I/O executors
• Ceph (bluestore, new backend)
• libuv
• Postgres
• RocksDB (and MyRocks)
• High performance cases
• TyrDB
Adoption
Facebook 50
Facebook 51
• FB internal bigcache project
●
1.7M QPS → 2.3M QPS
Results from the wild
Facebook 52
• FB internal bigcache project
●
1.7M QPS → 2.3M QPS
Results from the wild
Facebook 53
• FB internal bigcache project
●
1.7M QPS → 2.3M QPS
Results from the wild
Facebook 54
• Any system call fully async
• Linked commands with BPF?
• Key/Value store
• Continued efficiency improvements and optimizations
• Continue to improve documentation
Future
Facebook 55
• http://kernel.dk/io_uringuring.pdf
●
Definitive guide
• git://git.kernel.dk/fio
●
io_uring engine (engines/io_uring.c)
●
t/io_uring.c
• liburing has man pages (for system calls…)
●
Regression tests, example use cases
• https://lwn.net/Articles/776703/
●
Not fully current (Jan 15th
2019)
Resources

More Related Content

What's hot

High-Performance Networking Using eBPF, XDP, and io_uring
High-Performance Networking Using eBPF, XDP, and io_uringHigh-Performance Networking Using eBPF, XDP, and io_uring
High-Performance Networking Using eBPF, XDP, and io_uringScyllaDB
 
Understanding eBPF in a Hurry!
Understanding eBPF in a Hurry!Understanding eBPF in a Hurry!
Understanding eBPF in a Hurry!Ray Jenkins
 
Tuning Apache Spark for Large-Scale Workloads Gaoxiang Liu and Sital Kedia
Tuning Apache Spark for Large-Scale Workloads Gaoxiang Liu and Sital KediaTuning Apache Spark for Large-Scale Workloads Gaoxiang Liu and Sital Kedia
Tuning Apache Spark for Large-Scale Workloads Gaoxiang Liu and Sital KediaDatabricks
 
Launch the First Process in Linux System
Launch the First Process in Linux SystemLaunch the First Process in Linux System
Launch the First Process in Linux SystemJian-Hong Pan
 
re:Invent 2019 BPF Performance Analysis at Netflix
re:Invent 2019 BPF Performance Analysis at Netflixre:Invent 2019 BPF Performance Analysis at Netflix
re:Invent 2019 BPF Performance Analysis at NetflixBrendan Gregg
 
A whirlwind tour of the LLVM optimizer
A whirlwind tour of the LLVM optimizerA whirlwind tour of the LLVM optimizer
A whirlwind tour of the LLVM optimizerNikita Popov
 
FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料一路 川染
 
eBPF Perf Tools 2019
eBPF Perf Tools 2019eBPF Perf Tools 2019
eBPF Perf Tools 2019Brendan Gregg
 
Cosco: An Efficient Facebook-Scale Shuffle Service
Cosco: An Efficient Facebook-Scale Shuffle ServiceCosco: An Efficient Facebook-Scale Shuffle Service
Cosco: An Efficient Facebook-Scale Shuffle ServiceDatabricks
 
Kernel Recipes 2017: Using Linux perf at Netflix
Kernel Recipes 2017: Using Linux perf at NetflixKernel Recipes 2017: Using Linux perf at Netflix
Kernel Recipes 2017: Using Linux perf at NetflixBrendan Gregg
 
Linux Profiling at Netflix
Linux Profiling at NetflixLinux Profiling at Netflix
Linux Profiling at NetflixBrendan Gregg
 
How to use histograms to get better performance
How to use histograms to get better performanceHow to use histograms to get better performance
How to use histograms to get better performanceMariaDB plc
 
Page reclaim
Page reclaimPage reclaim
Page reclaimsiburu
 
Blazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBlazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBrendan Gregg
 
Physical Memory Models.pdf
Physical Memory Models.pdfPhysical Memory Models.pdf
Physical Memory Models.pdfAdrian Huang
 
Performance Analysis of Apache Spark and Presto in Cloud Environments
Performance Analysis of Apache Spark and Presto in Cloud EnvironmentsPerformance Analysis of Apache Spark and Presto in Cloud Environments
Performance Analysis of Apache Spark and Presto in Cloud EnvironmentsDatabricks
 
introduction to linux kernel tcp/ip ptocotol stack
introduction to linux kernel tcp/ip ptocotol stack introduction to linux kernel tcp/ip ptocotol stack
introduction to linux kernel tcp/ip ptocotol stack monad bobo
 

What's hot (20)

High-Performance Networking Using eBPF, XDP, and io_uring
High-Performance Networking Using eBPF, XDP, and io_uringHigh-Performance Networking Using eBPF, XDP, and io_uring
High-Performance Networking Using eBPF, XDP, and io_uring
 
Understanding eBPF in a Hurry!
Understanding eBPF in a Hurry!Understanding eBPF in a Hurry!
Understanding eBPF in a Hurry!
 
Tuning Apache Spark for Large-Scale Workloads Gaoxiang Liu and Sital Kedia
Tuning Apache Spark for Large-Scale Workloads Gaoxiang Liu and Sital KediaTuning Apache Spark for Large-Scale Workloads Gaoxiang Liu and Sital Kedia
Tuning Apache Spark for Large-Scale Workloads Gaoxiang Liu and Sital Kedia
 
Launch the First Process in Linux System
Launch the First Process in Linux SystemLaunch the First Process in Linux System
Launch the First Process in Linux System
 
re:Invent 2019 BPF Performance Analysis at Netflix
re:Invent 2019 BPF Performance Analysis at Netflixre:Invent 2019 BPF Performance Analysis at Netflix
re:Invent 2019 BPF Performance Analysis at Netflix
 
A whirlwind tour of the LLVM optimizer
A whirlwind tour of the LLVM optimizerA whirlwind tour of the LLVM optimizer
A whirlwind tour of the LLVM optimizer
 
Qemu JIT Code Generator and System Emulation
Qemu JIT Code Generator and System EmulationQemu JIT Code Generator and System Emulation
Qemu JIT Code Generator and System Emulation
 
FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料
 
eBPF Perf Tools 2019
eBPF Perf Tools 2019eBPF Perf Tools 2019
eBPF Perf Tools 2019
 
Cosco: An Efficient Facebook-Scale Shuffle Service
Cosco: An Efficient Facebook-Scale Shuffle ServiceCosco: An Efficient Facebook-Scale Shuffle Service
Cosco: An Efficient Facebook-Scale Shuffle Service
 
Kernel Recipes 2017: Using Linux perf at Netflix
Kernel Recipes 2017: Using Linux perf at NetflixKernel Recipes 2017: Using Linux perf at Netflix
Kernel Recipes 2017: Using Linux perf at Netflix
 
Linux Memory
Linux MemoryLinux Memory
Linux Memory
 
Spark tuning
Spark tuningSpark tuning
Spark tuning
 
Linux Profiling at Netflix
Linux Profiling at NetflixLinux Profiling at Netflix
Linux Profiling at Netflix
 
How to use histograms to get better performance
How to use histograms to get better performanceHow to use histograms to get better performance
How to use histograms to get better performance
 
Page reclaim
Page reclaimPage reclaim
Page reclaim
 
Blazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBlazing Performance with Flame Graphs
Blazing Performance with Flame Graphs
 
Physical Memory Models.pdf
Physical Memory Models.pdfPhysical Memory Models.pdf
Physical Memory Models.pdf
 
Performance Analysis of Apache Spark and Presto in Cloud Environments
Performance Analysis of Apache Spark and Presto in Cloud EnvironmentsPerformance Analysis of Apache Spark and Presto in Cloud Environments
Performance Analysis of Apache Spark and Presto in Cloud Environments
 
introduction to linux kernel tcp/ip ptocotol stack
introduction to linux kernel tcp/ip ptocotol stack introduction to linux kernel tcp/ip ptocotol stack
introduction to linux kernel tcp/ip ptocotol stack
 

Similar to Faster IO through io_uring

05 - Bypassing DEP, or why ASLR matters
05 - Bypassing DEP, or why ASLR matters05 - Bypassing DEP, or why ASLR matters
05 - Bypassing DEP, or why ASLR mattersAlexandre Moneger
 
Extensions on PostgreSQL
Extensions on PostgreSQLExtensions on PostgreSQL
Extensions on PostgreSQLAlpaca
 
Jupyter(Python)とBigQueryによるデータ分析基盤のDevOps #pyconjp
Jupyter(Python)とBigQueryによるデータ分析基盤のDevOps #pyconjp Jupyter(Python)とBigQueryによるデータ分析基盤のDevOps #pyconjp
Jupyter(Python)とBigQueryによるデータ分析基盤のDevOps #pyconjp @yuzutas0 Yokoyama
 
Performance #5 cpu and battery
Performance #5  cpu and batteryPerformance #5  cpu and battery
Performance #5 cpu and batteryVitali Pekelis
 
Confraria SECURITY & IT - Lisbon Set 29, 2011
Confraria SECURITY & IT - Lisbon Set 29, 2011Confraria SECURITY & IT - Lisbon Set 29, 2011
Confraria SECURITY & IT - Lisbon Set 29, 2011ricardomcm
 
Build 2016 - B880 - Top 6 Reasons to Move Your C++ Code to Visual Studio 2015
Build 2016 - B880 - Top 6 Reasons to Move Your C++ Code to Visual Studio 2015Build 2016 - B880 - Top 6 Reasons to Move Your C++ Code to Visual Studio 2015
Build 2016 - B880 - Top 6 Reasons to Move Your C++ Code to Visual Studio 2015Windows Developer
 
Cisco IOS shellcode: All-in-one
Cisco IOS shellcode: All-in-oneCisco IOS shellcode: All-in-one
Cisco IOS shellcode: All-in-oneDefconRussia
 
Prometheus as exposition format for eBPF programs running on Kubernetes
Prometheus as exposition format for eBPF programs running on KubernetesPrometheus as exposition format for eBPF programs running on Kubernetes
Prometheus as exposition format for eBPF programs running on KubernetesLeonardo Di Donato
 
BlueHat Seattle 2019 || Modern Binary Analysis with ILs
BlueHat Seattle 2019 || Modern Binary Analysis with ILsBlueHat Seattle 2019 || Modern Binary Analysis with ILs
BlueHat Seattle 2019 || Modern Binary Analysis with ILsBlueHat Security Conference
 
Booting directly opensuse iso file by grub2 @ openSUSE Asia Summit2015
Booting directly opensuse iso file by grub2 @ openSUSE Asia Summit2015Booting directly opensuse iso file by grub2 @ openSUSE Asia Summit2015
Booting directly opensuse iso file by grub2 @ openSUSE Asia Summit2015Kentaro Hatori
 
Library Operating System for Linux #netdev01
Library Operating System for Linux #netdev01Library Operating System for Linux #netdev01
Library Operating System for Linux #netdev01Hajime Tazaki
 
Information track presentation_final
Information track presentation_finalInformation track presentation_final
Information track presentation_finalKazuki Omo
 
Auditing the Opensource Kernels
Auditing the Opensource KernelsAuditing the Opensource Kernels
Auditing the Opensource KernelsSilvio Cesare
 
55 new things in Java 7 - Devoxx France
55 new things in Java 7 - Devoxx France55 new things in Java 7 - Devoxx France
55 new things in Java 7 - Devoxx FranceDavid Delabassee
 
みゆっき☆Think#4 「こんどはiPhoneに触ってみるよ!」
みゆっき☆Think#4 「こんどはiPhoneに触ってみるよ!」みゆっき☆Think#4 「こんどはiPhoneに触ってみるよ!」
みゆっき☆Think#4 「こんどはiPhoneに触ってみるよ!」techtalkdwango
 
5.5.1.2 packet tracer configure ios intrusion prevention system (ips) using...
5.5.1.2 packet tracer   configure ios intrusion prevention system (ips) using...5.5.1.2 packet tracer   configure ios intrusion prevention system (ips) using...
5.5.1.2 packet tracer configure ios intrusion prevention system (ips) using...Salem Trabelsi
 
DEF CON 23 - Phil Polstra - one device to pwn them all
DEF CON 23 - Phil Polstra - one device to pwn them allDEF CON 23 - Phil Polstra - one device to pwn them all
DEF CON 23 - Phil Polstra - one device to pwn them allFelipe Prado
 
Pycon2017 instagram keynote
Pycon2017 instagram keynotePycon2017 instagram keynote
Pycon2017 instagram keynoteLisa Guo
 

Similar to Faster IO through io_uring (20)

05 - Bypassing DEP, or why ASLR matters
05 - Bypassing DEP, or why ASLR matters05 - Bypassing DEP, or why ASLR matters
05 - Bypassing DEP, or why ASLR matters
 
Extensions on PostgreSQL
Extensions on PostgreSQLExtensions on PostgreSQL
Extensions on PostgreSQL
 
Jupyter(Python)とBigQueryによるデータ分析基盤のDevOps #pyconjp
Jupyter(Python)とBigQueryによるデータ分析基盤のDevOps #pyconjp Jupyter(Python)とBigQueryによるデータ分析基盤のDevOps #pyconjp
Jupyter(Python)とBigQueryによるデータ分析基盤のDevOps #pyconjp
 
Performance #5 cpu and battery
Performance #5  cpu and batteryPerformance #5  cpu and battery
Performance #5 cpu and battery
 
Confraria SECURITY & IT - Lisbon Set 29, 2011
Confraria SECURITY & IT - Lisbon Set 29, 2011Confraria SECURITY & IT - Lisbon Set 29, 2011
Confraria SECURITY & IT - Lisbon Set 29, 2011
 
Linux
LinuxLinux
Linux
 
Build 2016 - B880 - Top 6 Reasons to Move Your C++ Code to Visual Studio 2015
Build 2016 - B880 - Top 6 Reasons to Move Your C++ Code to Visual Studio 2015Build 2016 - B880 - Top 6 Reasons to Move Your C++ Code to Visual Studio 2015
Build 2016 - B880 - Top 6 Reasons to Move Your C++ Code to Visual Studio 2015
 
Cisco IOS shellcode: All-in-one
Cisco IOS shellcode: All-in-oneCisco IOS shellcode: All-in-one
Cisco IOS shellcode: All-in-one
 
Prometheus as exposition format for eBPF programs running on Kubernetes
Prometheus as exposition format for eBPF programs running on KubernetesPrometheus as exposition format for eBPF programs running on Kubernetes
Prometheus as exposition format for eBPF programs running on Kubernetes
 
BlueHat Seattle 2019 || Modern Binary Analysis with ILs
BlueHat Seattle 2019 || Modern Binary Analysis with ILsBlueHat Seattle 2019 || Modern Binary Analysis with ILs
BlueHat Seattle 2019 || Modern Binary Analysis with ILs
 
Booting directly opensuse iso file by grub2 @ openSUSE Asia Summit2015
Booting directly opensuse iso file by grub2 @ openSUSE Asia Summit2015Booting directly opensuse iso file by grub2 @ openSUSE Asia Summit2015
Booting directly opensuse iso file by grub2 @ openSUSE Asia Summit2015
 
Library Operating System for Linux #netdev01
Library Operating System for Linux #netdev01Library Operating System for Linux #netdev01
Library Operating System for Linux #netdev01
 
Information track presentation_final
Information track presentation_finalInformation track presentation_final
Information track presentation_final
 
Auditing the Opensource Kernels
Auditing the Opensource KernelsAuditing the Opensource Kernels
Auditing the Opensource Kernels
 
55 new things in Java 7 - Devoxx France
55 new things in Java 7 - Devoxx France55 new things in Java 7 - Devoxx France
55 new things in Java 7 - Devoxx France
 
みゆっき☆Think#4 「こんどはiPhoneに触ってみるよ!」
みゆっき☆Think#4 「こんどはiPhoneに触ってみるよ!」みゆっき☆Think#4 「こんどはiPhoneに触ってみるよ!」
みゆっき☆Think#4 「こんどはiPhoneに触ってみるよ!」
 
5.5.1.2 packet tracer configure ios intrusion prevention system (ips) using...
5.5.1.2 packet tracer   configure ios intrusion prevention system (ips) using...5.5.1.2 packet tracer   configure ios intrusion prevention system (ips) using...
5.5.1.2 packet tracer configure ios intrusion prevention system (ips) using...
 
DEF CON 23 - Phil Polstra - one device to pwn them all
DEF CON 23 - Phil Polstra - one device to pwn them allDEF CON 23 - Phil Polstra - one device to pwn them all
DEF CON 23 - Phil Polstra - one device to pwn them all
 
Pycon2017 instagram keynote
Pycon2017 instagram keynotePycon2017 instagram keynote
Pycon2017 instagram keynote
 
Clean code
Clean codeClean code
Clean code
 

More from Anne Nicolas

Kernel Recipes 2019 - Driving the industry toward upstream first
Kernel Recipes 2019 - Driving the industry toward upstream firstKernel Recipes 2019 - Driving the industry toward upstream first
Kernel Recipes 2019 - Driving the industry toward upstream firstAnne Nicolas
 
Kernel Recipes 2019 - No NMI? No Problem! – Implementing Arm64 Pseudo-NMI
Kernel Recipes 2019 - No NMI? No Problem! – Implementing Arm64 Pseudo-NMIKernel Recipes 2019 - No NMI? No Problem! – Implementing Arm64 Pseudo-NMI
Kernel Recipes 2019 - No NMI? No Problem! – Implementing Arm64 Pseudo-NMIAnne Nicolas
 
Kernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernel
Kernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernelKernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernel
Kernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernelAnne Nicolas
 
Kernel Recipes 2019 - Metrics are money
Kernel Recipes 2019 - Metrics are moneyKernel Recipes 2019 - Metrics are money
Kernel Recipes 2019 - Metrics are moneyAnne Nicolas
 
Kernel Recipes 2019 - Kernel documentation: past, present, and future
Kernel Recipes 2019 - Kernel documentation: past, present, and futureKernel Recipes 2019 - Kernel documentation: past, present, and future
Kernel Recipes 2019 - Kernel documentation: past, present, and futureAnne Nicolas
 
Embedded Recipes 2019 - Knowing your ARM from your ARSE: wading through the t...
Embedded Recipes 2019 - Knowing your ARM from your ARSE: wading through the t...Embedded Recipes 2019 - Knowing your ARM from your ARSE: wading through the t...
Embedded Recipes 2019 - Knowing your ARM from your ARSE: wading through the t...Anne Nicolas
 
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary dataKernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary dataAnne Nicolas
 
Kernel Recipes 2019 - Analyzing changes to the binary interface exposed by th...
Kernel Recipes 2019 - Analyzing changes to the binary interface exposed by th...Kernel Recipes 2019 - Analyzing changes to the binary interface exposed by th...
Kernel Recipes 2019 - Analyzing changes to the binary interface exposed by th...Anne Nicolas
 
Embedded Recipes 2019 - Remote update adventures with RAUC, Yocto and Barebox
Embedded Recipes 2019 - Remote update adventures with RAUC, Yocto and BareboxEmbedded Recipes 2019 - Remote update adventures with RAUC, Yocto and Barebox
Embedded Recipes 2019 - Remote update adventures with RAUC, Yocto and BareboxAnne Nicolas
 
Embedded Recipes 2019 - Making embedded graphics less special
Embedded Recipes 2019 - Making embedded graphics less specialEmbedded Recipes 2019 - Making embedded graphics less special
Embedded Recipes 2019 - Making embedded graphics less specialAnne Nicolas
 
Embedded Recipes 2019 - Linux on Open Source Hardware and Libre Silicon
Embedded Recipes 2019 - Linux on Open Source Hardware and Libre SiliconEmbedded Recipes 2019 - Linux on Open Source Hardware and Libre Silicon
Embedded Recipes 2019 - Linux on Open Source Hardware and Libre SiliconAnne Nicolas
 
Embedded Recipes 2019 - From maintaining I2C to the big (embedded) picture
Embedded Recipes 2019 - From maintaining I2C to the big (embedded) pictureEmbedded Recipes 2019 - From maintaining I2C to the big (embedded) picture
Embedded Recipes 2019 - From maintaining I2C to the big (embedded) pictureAnne Nicolas
 
Embedded Recipes 2019 - Testing firmware the devops way
Embedded Recipes 2019 - Testing firmware the devops wayEmbedded Recipes 2019 - Testing firmware the devops way
Embedded Recipes 2019 - Testing firmware the devops wayAnne Nicolas
 
Embedded Recipes 2019 - Herd your socs become a matchmaker
Embedded Recipes 2019 - Herd your socs become a matchmakerEmbedded Recipes 2019 - Herd your socs become a matchmaker
Embedded Recipes 2019 - Herd your socs become a matchmakerAnne Nicolas
 
Embedded Recipes 2019 - LLVM / Clang integration
Embedded Recipes 2019 - LLVM / Clang integrationEmbedded Recipes 2019 - LLVM / Clang integration
Embedded Recipes 2019 - LLVM / Clang integrationAnne Nicolas
 
Embedded Recipes 2019 - Introduction to JTAG debugging
Embedded Recipes 2019 - Introduction to JTAG debuggingEmbedded Recipes 2019 - Introduction to JTAG debugging
Embedded Recipes 2019 - Introduction to JTAG debuggingAnne Nicolas
 
Embedded Recipes 2019 - Pipewire a new foundation for embedded multimedia
Embedded Recipes 2019 - Pipewire a new foundation for embedded multimediaEmbedded Recipes 2019 - Pipewire a new foundation for embedded multimedia
Embedded Recipes 2019 - Pipewire a new foundation for embedded multimediaAnne Nicolas
 
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all startedKernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all startedAnne Nicolas
 
Kernel Recipes 2019 - Suricata and XDP
Kernel Recipes 2019 - Suricata and XDPKernel Recipes 2019 - Suricata and XDP
Kernel Recipes 2019 - Suricata and XDPAnne Nicolas
 
Kernel Recipes 2019 - Marvels of Memory Auto-configuration (SPD)
Kernel Recipes 2019 - Marvels of Memory Auto-configuration (SPD)Kernel Recipes 2019 - Marvels of Memory Auto-configuration (SPD)
Kernel Recipes 2019 - Marvels of Memory Auto-configuration (SPD)Anne Nicolas
 

More from Anne Nicolas (20)

Kernel Recipes 2019 - Driving the industry toward upstream first
Kernel Recipes 2019 - Driving the industry toward upstream firstKernel Recipes 2019 - Driving the industry toward upstream first
Kernel Recipes 2019 - Driving the industry toward upstream first
 
Kernel Recipes 2019 - No NMI? No Problem! – Implementing Arm64 Pseudo-NMI
Kernel Recipes 2019 - No NMI? No Problem! – Implementing Arm64 Pseudo-NMIKernel Recipes 2019 - No NMI? No Problem! – Implementing Arm64 Pseudo-NMI
Kernel Recipes 2019 - No NMI? No Problem! – Implementing Arm64 Pseudo-NMI
 
Kernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernel
Kernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernelKernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernel
Kernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernel
 
Kernel Recipes 2019 - Metrics are money
Kernel Recipes 2019 - Metrics are moneyKernel Recipes 2019 - Metrics are money
Kernel Recipes 2019 - Metrics are money
 
Kernel Recipes 2019 - Kernel documentation: past, present, and future
Kernel Recipes 2019 - Kernel documentation: past, present, and futureKernel Recipes 2019 - Kernel documentation: past, present, and future
Kernel Recipes 2019 - Kernel documentation: past, present, and future
 
Embedded Recipes 2019 - Knowing your ARM from your ARSE: wading through the t...
Embedded Recipes 2019 - Knowing your ARM from your ARSE: wading through the t...Embedded Recipes 2019 - Knowing your ARM from your ARSE: wading through the t...
Embedded Recipes 2019 - Knowing your ARM from your ARSE: wading through the t...
 
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary dataKernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
 
Kernel Recipes 2019 - Analyzing changes to the binary interface exposed by th...
Kernel Recipes 2019 - Analyzing changes to the binary interface exposed by th...Kernel Recipes 2019 - Analyzing changes to the binary interface exposed by th...
Kernel Recipes 2019 - Analyzing changes to the binary interface exposed by th...
 
Embedded Recipes 2019 - Remote update adventures with RAUC, Yocto and Barebox
Embedded Recipes 2019 - Remote update adventures with RAUC, Yocto and BareboxEmbedded Recipes 2019 - Remote update adventures with RAUC, Yocto and Barebox
Embedded Recipes 2019 - Remote update adventures with RAUC, Yocto and Barebox
 
Embedded Recipes 2019 - Making embedded graphics less special
Embedded Recipes 2019 - Making embedded graphics less specialEmbedded Recipes 2019 - Making embedded graphics less special
Embedded Recipes 2019 - Making embedded graphics less special
 
Embedded Recipes 2019 - Linux on Open Source Hardware and Libre Silicon
Embedded Recipes 2019 - Linux on Open Source Hardware and Libre SiliconEmbedded Recipes 2019 - Linux on Open Source Hardware and Libre Silicon
Embedded Recipes 2019 - Linux on Open Source Hardware and Libre Silicon
 
Embedded Recipes 2019 - From maintaining I2C to the big (embedded) picture
Embedded Recipes 2019 - From maintaining I2C to the big (embedded) pictureEmbedded Recipes 2019 - From maintaining I2C to the big (embedded) picture
Embedded Recipes 2019 - From maintaining I2C to the big (embedded) picture
 
Embedded Recipes 2019 - Testing firmware the devops way
Embedded Recipes 2019 - Testing firmware the devops wayEmbedded Recipes 2019 - Testing firmware the devops way
Embedded Recipes 2019 - Testing firmware the devops way
 
Embedded Recipes 2019 - Herd your socs become a matchmaker
Embedded Recipes 2019 - Herd your socs become a matchmakerEmbedded Recipes 2019 - Herd your socs become a matchmaker
Embedded Recipes 2019 - Herd your socs become a matchmaker
 
Embedded Recipes 2019 - LLVM / Clang integration
Embedded Recipes 2019 - LLVM / Clang integrationEmbedded Recipes 2019 - LLVM / Clang integration
Embedded Recipes 2019 - LLVM / Clang integration
 
Embedded Recipes 2019 - Introduction to JTAG debugging
Embedded Recipes 2019 - Introduction to JTAG debuggingEmbedded Recipes 2019 - Introduction to JTAG debugging
Embedded Recipes 2019 - Introduction to JTAG debugging
 
Embedded Recipes 2019 - Pipewire a new foundation for embedded multimedia
Embedded Recipes 2019 - Pipewire a new foundation for embedded multimediaEmbedded Recipes 2019 - Pipewire a new foundation for embedded multimedia
Embedded Recipes 2019 - Pipewire a new foundation for embedded multimedia
 
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all startedKernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all started
 
Kernel Recipes 2019 - Suricata and XDP
Kernel Recipes 2019 - Suricata and XDPKernel Recipes 2019 - Suricata and XDP
Kernel Recipes 2019 - Suricata and XDP
 
Kernel Recipes 2019 - Marvels of Memory Auto-configuration (SPD)
Kernel Recipes 2019 - Marvels of Memory Auto-configuration (SPD)Kernel Recipes 2019 - Marvels of Memory Auto-configuration (SPD)
Kernel Recipes 2019 - Marvels of Memory Auto-configuration (SPD)
 

Recently uploaded

Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerThousandEyes
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationkaushalgiri8080
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfCionsystems
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendArshad QA
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number SystemsJheuzeDellosa
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 

Recently uploaded (20)

Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanation
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdf
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and Backend
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number Systems
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 

Faster IO through io_uring

  • 1.
  • 2. Faster IO through io uring_uring Jens Axboe Software Engineer, Facebook Kernel Recipes 2019, Sep 26th 2019
  • 3. Facebook 3 • read(2) / write(2) • pread(2) / pwrite(2) • preadv(2) / pwritev(2) • preadv2(2) / pwritev2(2) • fsync(2) / sync_data_range(2) Rewind one year...
  • 4. Facebook 4 • io_setup(2) → io_submit(2) → io_getevents(2) • Supports read/write, poll, fsync • Buffered? lol • O_DIRECT always asynchronous? Nope • Efficiency ● System calls ● Copy ● Ring buffer ● Overall performance lacking today Rewind one year aio/libaio… aio/libaio
  • 5. Facebook 5 • Limited, O_DIRECT is fairly niche • Which leads to… commit 84c4e1f89fefe70554da0ab33be72c9be7994379 Author: Linus Torvalds <torvalds@linux-foundation.org> Date: Sun Mar 3 14:23:33 2019 -0800 aio: simplify - and fix - fget/fput for io_submit() Adoption
  • 6. Facebook 6 • Support for missing features ● Buffered async IO ● Polled IO ● New features that allow general overhead reduction • API that doesn’t suck • Efficient ● Low latency ● High IOPS ● System call limiting • Could aio be fixed? What do we need - tldr
  • 7. Facebook 7 • Yes, I know what it sounds like… • Merged in v5.1-rc1 ● First posted January 8th 2019 ● Merged March 8th 2019 • So obviously Linus totally loves it io uring_uring
  • 8. Facebook 8 “So honestly, the big issue is that this is *YET* another likely failed interface that absolutely nobody will use, and that we will have absolutely zero visibility into.” Linus
  • 9. Facebook 9 “It will probably have subtle and nasty bugs, not just because nobody tests it, but because that's how asynchronous code works - it's hard.” Linus
  • 10. Facebook 10 “And they are security issues too, and they'd never show up in the one or two actual users we might have (because they require that you race with closing the file descriptor that is used asynchronously).” Linus
  • 11. Facebook 11 “Or all the garbage direct-IO crap. It's shit. I know the XFS people love it, but it's *still* shit.” Linus
  • 13. Facebook 13 “So the fundamental issue is that it needs to be so good that I don't go "why isn't this *exactly* the same as all the other failed clever things we've done"?” Linus
  • 14. Facebook 14 • Yes, I know what it sounds like… • Merged in v5.1-rc1 ● First posted January 8th 2019 ● Merged March 8th 2019 • So obviously Linus totally loves it ● Deep down somewhere… io uring_uring
  • 15. Facebook 15 • Fundamentally, ring based communication channel ● Submission Queue, SQ ● struct io_uring_sqe ● Completion Queue, CQ ● struct io_uring_cqe • All data shared between kernel and application • Adds critically missing features • Aim for easy to use, while powerful ● Hard to misuse • Flexible and extendable! What is it
  • 16. Facebook 16 • int io_uring_setup(u32 nentries, struct io_uring_params *p); ● → returns ring file descriptor struct io_uring_params { __u32 sq_entries; __u32 cq_entries; __u32 flags; __u32 sq_thread_cpu; __u32 sq_thread_idle; __u32 features; __u32 resv[4]; struct io_sqring_offsets sq_off; struct io_cqring_offsets cq_off; }; Ring setup
  • 17. Facebook 17 struct io_sqring_offsets { __u32 head; __u32 tail; __u32 ring_mask; __u32 ring_entries; __u32 flags; __u32 dropped; __u32 array; __u32 resv1; __u64 resv2; };
  • 18. Facebook 18 #define IORING_OFF_SQ_RING 0ULL #define IORING_OFF_CQ_RING 0x8000000ULL #define IORING_OFF_SQES 0x10000000ULL sq→ring_ptr = mmap(0, sq→ring_sz, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, ring_fd, IORING_OFF_SQ_RING); sq→khead = sq→ring_ptr + p→sq_off.head; sq→ktail = sq→ring_ptr + p→sq_off.tail; […] Ring access
  • 19. Facebook 19 • head and tail indices free running ● Integer wraps ● Entry always head/tail masked with ring mask • App produces SQ ring entries ● Updates tail, kernel consumes at head ● →array[] holds index into →sqes[] ● Why not directly indexed? • Kernel produces CQ ring entries ● Updates tail, app consumes at head ● →cqes[] indexed directly Reading and writing rings
  • 20. Facebook 20 struct io_uring_sqe { __u8 opcode; /* type of operation for this sqe */ __u8 flags; /* IOSQE_ flags */ __u16 ioprio; /* ioprio for the request */ __s32 fd; /* file descriptor to do IO on */ __u64 off; /* offset into file */ __u64 addr; /* pointer to buffer or iovecs */ __u32 len; /* buffer size or number of iovecs */ union { __u32 misc_flags; }; __u64 user_data; /* data to be passed back at completion time */ }; SQEs
  • 21. Facebook 21 struct io_uring_sqe *sqe; unsigned index, tail; tail = ring->tail; read_barrier(); /* SQ ring full */ if (tail + 1 == ring->head) return FULL; index = tail & ring->sq_ring_mask; sqe = &ring->sqes[index]; /* fill in sqe here */ ring->array[index] = index; write_barrier(); ring->tail = tail + 1; write_barrier(); Filling in a new SQE
  • 22. Facebook 22 struct io_uring_cqe { __u64 user_data; /* sqe->data submission passed back */ __s32 res; /* result code for this event */ __u32 flags; }; CQEs
  • 23. Facebook 23 struct io_uring_cqe *cqe; unsigned head, index; head = ring->head; do { read_barrier(); /* cq ring empty */ if (head == ring->tail) break; index = head & ring->cq_ring_mask; cqe = &ring->cqes[index]; /* handle done IO */ head++; } while (1); ring->head = head; write_barrier(); Finding completed CQE
  • 24. Facebook 24 • int io_uring_enter(int ring_fd, u32 to_submit, u32 min_complete, u32 flags, sigset_t *sigset); #define IORING_ENTER_GETEVENTS (1U << 0) #define IORING_ENTER_SQ_WAKEUP (1U << 1) • Enables submit AND complete in one system call • Non-blocking • Requests can be handled inline Submitting and reaping IO
  • 25. Facebook 25 #define IORING_OP_NOP 0 #define IORING_OP_READV 1 #define IORING_OP_WRITEV 2 #define IORING_OP_FSYNC 3 #define IORING_OP_READ_FIXED 4 #define IORING_OP_WRITE_FIXED 5 #define IORING_OP_POLL_ADD 6 #define IORING_OP_POLL_REMOVE 7 #define IORING_OP_SYNC_FILE_RANGE 8 #define IORING_OP_SENDMSG 9 #define IORING_OP_RECVMSG 10 #define IORING_OP_TIMEOUT 11 Supported operations
  • 26. Facebook 26 • Only two hard problems in computer science 1) Cache invalidation 2) Memory ordering 3) Off-by-one errors I thought you said “easy to use”..?
  • 27. Facebook 27 • Helpers for setup liburing to the rescue
  • 28. Facebook 28 static int setup_ring(struct submitter *s) { struct io_sq_ring *sring = &s->sq_ring; struct io_cq_ring *cring = &s->cq_ring; struct io_uring_params p; int ret, fd; void *ptr; memset(&p, 0, sizeof(p)); fd = io_uring_setup(depth, &p); if (fd < 0) { perror("io_uring_setup"); return 1; } s->ring_fd = fd; ptr = mmap(0, p.sq_off.array + p.sq_entries * sizeof(__u32), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_SQ_RING); printf("sq_ring ptr = 0x%pn", ptr); sring->head = ptr + p.sq_off.head; sring->tail = ptr + p.sq_off.tail; sring->ring_mask = ptr + p.sq_off.ring_mask; sring->ring_entries = ptr + p.sq_off.ring_entries; sring->flags = ptr + p.sq_off.flags; sring->array = ptr + p.sq_off.array; sq_ring_mask = *sring->ring_mask; s->sqes = mmap(0, p.sq_entries * sizeof(struct io_uring_sqe), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_SQES); printf("sqes ptr = 0x%pn", s->sqes); ptr = mmap(0, p.cq_off.cqes + p.cq_entries * sizeof(struct io_uring_cqe), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_CQ_RING); printf("cq_ring ptr = 0x%pn", ptr); cring->head = ptr + p.cq_off.head; cring->tail = ptr + p.cq_off.tail; cring->ring_mask = ptr + p.cq_off.ring_mask; cring->ring_entries = ptr + p.cq_off.ring_entries; cring->cqes = ptr + p.cq_off.cqes; cq_ring_mask = *cring->ring_mask; return 0; }
  • 29. Facebook 29 #include <liburing.h> struct io_uring ring; int ret; ret = io_uring_queue_init(DEPTH, &ring, 0);
  • 30. Facebook 30 • Helpers for setup • Helpers for submitting IO liburing to the rescue
  • 31. Facebook 31 static int prep_more_ios(struct submitter *s, int max_ios) { struct io_sq_ring *ring = &s->sq_ring; unsigned index, tail, next_tail, prepped = 0; next_tail = tail = *ring->tail; do { next_tail++; read_barrier(); if (next_tail == *ring->head) break; index = tail & sq_ring_mask; init_io(s, index); ring->array[index] = index; prepped++; tail = next_tail; } while (prepped < max_ios); if (*ring->tail != tail) { /* order tail store with writes to sqes above */ write_barrier(); *ring->tail = tail; write_barrier(); } return prepped; }
  • 32. Facebook 32 struct io_uring_sqe *sqe; struct io_uring_cqe *cqe; struct iovec iov; sqe = io_uring_get_sqe(ring); ← previous example to here iov.iov_base = some_addr; iov.iov_len = some_len; io_uring_prep_readv(sqe, ring->fd, &iov, 1 offset); io_uring_submit(ring); io_uring_wait_cqe(ring, &cqe); [read cqe] io_uring_cqe_seen(ring, cqe);
  • 33. Facebook 33 • Helpers for setup • Helpers for submitting IO ● Eliminates need for manual memory barriers • Mix and match raw and liburing without issue • liburing package contains kernel header as well • Use it! Don’t be a hero • git://git.kernel.dk/liburing liburing to the rescue
  • 34. Facebook 34 • io_uring_queue_{init,exit}(); • io_uring_get_sqe(); • io_uring_prep_{readv,writev,read_fixed,write_fixed}(); io_uring_prep_{recv,send}msg(); io_uring_prep_poll_{add,remove}(); io_uring_prep_fsync(); • io_uring_submit(); io_uring_submit_and_wait(); • io_uring_{wait,peek}_cqe(); • io_uring_cqe_seen{}; • io_uring_{set,get}_data(); liburing at a glance
  • 35. Facebook 35 • Set IOSQE_IO_DRAIN in sqe→flags • If set, waits for previous commands to complete • Eliminates write→write→write, wait for all writes, sync Feature: Drain flag
  • 36. Facebook 36 • Form arbitrary length chain of commands ● “Do this sqe IFF previous sqe succeeds” • write→write→write→fsync • read{fileX,posX,sizeX}→write{fileY,posY,sizeY} ● See liburing examples/link-cp.c • Set IOSQE_IO_LINK in sqe→flags ● Dependency chain continues until not set • Ease of programming, system call reductions Feature: Linked commands
  • 37. Facebook 37 • int io_uring_register(int ring_fd, u32 op, void *arg, u32 nr_args); #define IORING_REGISTER_BUFFERS 0 #define IORING_UNREGISTER_BUFFERS 1 #define IORING_REGISTER_FILES 2 #define IORING_UNREGISTER_FILES 3 #define IORING_REGISTER_EVENTFD 4 #define IORING_UNREGISTER_EVENTFD 5 Registering aux functions
  • 38. Facebook 38 • Takes a struct iovec array as argument ● Length of array nr_args • Eliminates get_user_pages() in submission path ● ~100 nsec • Eliminates put_pages() in completion path • Use with IORING_OP_READ_FIXED, IORING_OP_WRITE_FIXED ● Not iovec based ● sqe→buf_index points to index of registered array ● sqe→addr is within buffer, sqe→len is length in bytes Registered buffers
  • 39. Facebook 39 • Takes a s32 array as argument ● Length of array as nr_args • Eliminates atomic fget() for submission • Eliminates atomic fput() for completion • Use array index as fd ● Set IOSQE_FIXED_FILE • Circular references ● Setup socket, register both ends with io_uring ● Pass io_uring fd through socket ● https://lwn.net/Articles/779472/ Registered files
  • 40. Facebook 40 • Takes a s32 pointer as argument ● nr_args ignored • Allows completion notifications Registered eventfd
  • 41. Facebook 41 • Not poll(2) ● Are we there yet? • Trades CPU usage for latency win ● Until a certain point • Absolutely necessary for low latency devices • Use IORING_SETUP_IOPOLL • Submission the same, reaping is polled • Can’t be mixed with non-polled IO • Raw bdev support (eg nvme), files on XFS Polled IO
  • 42. Facebook 42 • Use IORING_SETUP_SQPOLL ● IORING_SETUP_SQ_AFF • Submission now offloaded, reaping is app polled • Independent of IORING_SETUP_IOPOLL • Busy loops for params→sq_thread_idle msec when idle ● Sets sq_ring→flags |= IORING_SQ_NEED_WAKEUP • Allows splitting submit / complete load onto separate cores Polled IO submission
  • 44. Facebook 44 io uring vs aio peak_uring
  • 46. Facebook 46 io uring vs aio sync_uring
  • 47. Facebook 47 • Rust, C++ I/O executors • Ceph (bluestore, new backend) • libuv • Postgres • RocksDB (and MyRocks) Adoption
  • 49. Facebook 49 • Rust, C++ I/O executors • Ceph (bluestore, new backend) • libuv • Postgres • RocksDB (and MyRocks) • High performance cases • TyrDB Adoption
  • 51. Facebook 51 • FB internal bigcache project ● 1.7M QPS → 2.3M QPS Results from the wild
  • 52. Facebook 52 • FB internal bigcache project ● 1.7M QPS → 2.3M QPS Results from the wild
  • 53. Facebook 53 • FB internal bigcache project ● 1.7M QPS → 2.3M QPS Results from the wild
  • 54. Facebook 54 • Any system call fully async • Linked commands with BPF? • Key/Value store • Continued efficiency improvements and optimizations • Continue to improve documentation Future
  • 55. Facebook 55 • http://kernel.dk/io_uringuring.pdf ● Definitive guide • git://git.kernel.dk/fio ● io_uring engine (engines/io_uring.c) ● t/io_uring.c • liburing has man pages (for system calls…) ● Regression tests, example use cases • https://lwn.net/Articles/776703/ ● Not fully current (Jan 15th 2019) Resources