<jinuk.kim@ifunfactory.com>
2018 iFunFactory Dev Day
(2013-)
• (C++, C#)
• (Python)
(2012-2013)
• (Python)
(2007-2012)
• (C++)
• (C++, C#, Python)
• (C#)
2018 iFunFactory Dev Day
Contents.
01
02
03
04
05
06
2018 iFunFactory Dev Day
01
2018 iFunFactory Dev Day
?
?
Linux eBPF + BCC
2018 iFunFactory Dev Day
:
02
2018 iFunFactory Dev Day
:
• (2017 )
• +
•
• DB /
• CPU
• (lock)
• (DB, redis, 3rd party API)
•
2018 iFunFactory Dev Day
:
2018 iFunFactory Dev Day
:
• / DB / CPU ( / / / )
• DB
• /
2018 iFunFactory Dev Day
•
.
• /
• / / (fiber) /
•
• /
•
•
2018 iFunFactory Dev Day
• / .
• .
•
•
• / /
2018 iFunFactory Dev Day
03
2018 iFunFactory Dev Day
• /
2018 iFunFactory Dev Day
: CPU
• GNU Compiler Collection (GCC)
• -pg (gprof)
• LLVM/Clang
• -fprofile-instr-generate
• Visual C++ instrumentation
• Valgrind Callgrind
2018 iFunFactory Dev Day
• /
• /
•
• /
2018 iFunFactory Dev Day
GProf :
% cumulative self self total
time seconds seconds calls ms/call ms/call name
14.29 0.03 0.03 207323 0.00 0.00 crow::json::escape
14.29 0.06 0.03 3059 0.01 0.02 crow::CrowApp::handle
9.52 0.08 0.02 2638 0.01 0.02 crow::json::dump_internal
4.76 0.09 0.01 307190 0.00 0.00 _Hashtable<…>::insert_unique
4.76 0.10 0.01 208356 0.00 0.00 _Hashtable<…>::_M_rehash
4.76 0.11 0.01 19129 0.00 0.00
vector<crow::json::wvalue>::_M_emplace_back_aux
4.76 0.12 0.01 11961 0.00 0.00
crow::Connection<crow::SocketAdaptor, crow::CrowApp>::cancel_deadline_timer
2018 iFunFactory Dev Day
GProf :
2018 iFunFactory Dev Day
• gprof: 30% - 300%
• Valgrind: 400% - 4,000%
• 3rd (.dll, .so)
•
2018 iFunFactory Dev Day
.
/
• (CPU, , , )
•
•
2018 iFunFactory Dev Day
• IO 10ms ?
• ?
• ?
2018 iFunFactory Dev Day
04
2018 iFunFactory Dev Day
CPU
• .
• Linux perf (kernel v2.6+)
• Linux eBPF (kernel v3.18+; v4.9+)
• Google Performance Tools
• Visual C++ : CPU
2018 iFunFactory Dev Day
• ( 50 - 200 )
• CPU
•
• /
2018 iFunFactory Dev Day
: CPU
Linux v4.13 eBPF + BCC profile:
Flamegraph: / 

https://github.com/brendangregg/FlameGraph
2018 iFunFactory Dev Day
2018 iFunFactory Dev Day
2018 iFunFactory Dev Day


OS
/
( ), OS
2018 iFunFactory Dev Day
OS
OS
OS !
• Linux v4.13 randstruct
• eBPF #define
2018 iFunFactory Dev Day
?
•Disk I/O ?
•CPU ?
• (lock) ?
• API ?
• ?
• ?
2018 iFunFactory Dev Day
Linux
•eBPF (kernel v3.18+; 4.9+ )
•perf (kernel v2.6+; )
Windows
•Event Tracing for Windows (ETW; Win 8+)
•Windows Event Logging ( ; Win 2k+)
2018 iFunFactory Dev Day
?
/ ?
2018 iFunFactory Dev Day


2018 iFunFactory Dev Day
/
2018 iFunFactory Dev Day
Linux eBPF + BCC
• eBPF: /
• BCC: Python / lua / go eBPF
2018 iFunFactory Dev Day
eBPF
OS 

(x86-64/arm64 )
VM
• / ( )
•
• JIT
2018 iFunFactory Dev Day
eBPF: ?
•
• (= )
• ( )
•
( )
2018 iFunFactory Dev Day
BCC
• eBFP Compiler Collection
• Python / lua / go /
• C eBPF
• eBPF
• python / lua / go
2018 iFunFactory Dev Day
eBPF + BCC:
CPU, , I/O,
eBPF + BCC
( )
:
1. ,
2. eBPF + BCC
3.
2018 iFunFactory Dev Day
BCC :
BCC funclatency
/
2018 iFunFactory Dev Day
: eBPF (1)
2018 iFunFactory Dev Day
: eBPF (2)
2018 iFunFactory Dev Day
2018 iFunFactory Dev Day
: BCC + BPF
2018 iFunFactory Dev Day
:
2018 iFunFactory Dev Day
Linux Kernel v4.13+
randstruct .
BCC “bpf_text”
#define randomized_struct_fields_start struct {
#define randomized_struct_fields_end };
2018 iFunFactory Dev Day
05 HTTP API
2018 iFunFactory Dev Day
HTTP API
I/O, DB , ( )
/OS
: flaskr
• Crow HTTP
• CrowDB + MariaDB
• RESTful API
• https://github.com/jinukkim/devday-2018-03
2018 iFunFactory Dev Day
HTTP :
URL / HTTP
HTTP ,

4 

2018 iFunFactory Dev Day
HTTP :
DB
JSON
HTTP
2018 iFunFactory Dev Day
HTTP :
MariaDB DB
HTTP DNS
2018 iFunFactory Dev Day
4 1000
250
≦ 4 ms
2018 iFunFactory Dev Day
siege: HTTP
siege -c 32

-r 16384

-b

http://example.com
URL 32 (-c32)
(-b)
16k (-r 16384)
2018 iFunFactory Dev Day
:
110 /
: 27.5 /
: 36 ms
2018 iFunFactory Dev Day
?
2018 iFunFactory Dev Day
#1: CPU
2018 iFunFactory Dev Day
: CPU ?
eBPF + BCC: profile
•
•
30 , 199 flaskr
sudo profile -p $(pgrep -nx flaskr)

-f

-F 199 30

2018 iFunFactory Dev Day
(1): Flamegraph
2018 iFunFactory Dev Day
(2):
DNS C (10%)
• __GI_nss_files_servent
(OS )
• TCP (6.3%)
• (3%)
• (2%)
( ) !
2018 iFunFactory Dev Day
CPU ?
Linux htop (= top )
• CPU 42% CPU .
2018 iFunFactory Dev Day
#2:
2018 iFunFactory Dev Day
#2 ?
HTTP API
:
• DB
• SQL
• SQL
• etc.
2018 iFunFactory Dev Day
: DB ?
eBPF + BCC: mysql_qslower:
eBPF + BCC: funclatency
•
MariaDB (mysql_ )

sudo funclatency.py -p $(pgrep -nx flaskr)

-F /usr/lib/mariadb/libmariadb.so:mysql_*
2018 iFunFactory Dev Day
: SQL
• : 0.5 ms - 2 ms
• 2 ms ≪ 36 ms ( )
2018 iFunFactory Dev Day
: SQL
• : 0.008 ms - 0.032 ms
• 0.032 ms ≪ 36 ms ( )
2018 iFunFactory Dev Day
2018 iFunFactory Dev Day
#3: DB
2018 iFunFactory Dev Day
:
?
?
• CPU
• OS CPU
:
• OS CPU
• CPU =
2018 iFunFactory Dev Day
:
eBPF + BCC: offcputime
•
•
2018 iFunFactory Dev Day
: Flamegraph
• poll() : C . 78%;
• epoll() : . 16%; boost::asio
2018 iFunFactory Dev Day
: poll() ?
2018 iFunFactory Dev Day
poll()
C++
( )
!
2018 iFunFactory Dev Day
?
•
• :
•
• /
2018 iFunFactory Dev Day
eBPF + BCC: offwaketime
:
•
•
offwaketime -p $(pgrep -nx flaskr) -f
2018 iFunFactory Dev Day
• UDP/IP poll
2018 iFunFactory Dev Day
: UDP ?
2018 iFunFactory Dev Day
UDP ?
HTTP TCP/IP
UDP :
• DHCP
• DNS
• RTP
• etc…
DNS . ( )
2018 iFunFactory Dev Day
: DNS ?
2018 iFunFactory Dev Day
DNS
DNS (C API )
• getnameinfo
• getaddrinfo
• gethostname
• etc…
eBPF + BCC: funclatency
2018 iFunFactory Dev Day
• getnameinfo
• 32ms - 134ms
• (36ms)
2018 iFunFactory Dev Day
: DNS
DNS DNS dnsmasq
: 1,567 /
• 390 / , 2.5 ms
: 14
• : 110 / vs. 1,567 /
2018 iFunFactory Dev Day
: MS Windows + ETW
GUI + /
ETW / Xperf
: The Lost Xperf Documentation on CPU Scheduling
2018 iFunFactory Dev Day
06 

/
2018 iFunFactory Dev Day
(runqlat)
• ( ?)
Disk I/O
• I/O (fileslower)
• (filetop)
• ext4slower, btrfsslower,
2018 iFunFactory Dev Day
(memleak)
• 30 ?
(deadlock_detector)
• mutex
2018 iFunFactory Dev Day
Android /
https://lwn.net/Articles/742363/
2018 iFunFactory Dev Day
Android /
eBPF
x86-64 / arm64
1. 

+ LLVM
2. Android
3. 

4. 

/ /
https://github.com/joelagnel/bpfd
2018 iFunFactory Dev Day
Android /
BPFd 

(https://github.com/joelagnel/bpfd)
eBPF + BCC (v4.6+; v4.9+)
• Android 8.0 Oreo v4.4
AOSP 8.0 v4.10;
2018 iFunFactory Dev Day

 

eBPF + BCC
Q&A
2018 iFunFactory Dev Day
2018 iFunFactory Dev Day
Thank You!
660, 1 B 606
+82-70-4923-6566 www.ifunfactory.cominfo@ifunfactory.com

[아이펀팩토리] 2018 데브데이 서버위더스 _04 리눅스 게임 서버 성능 분석