58
How Badoo Saved $1M Switching to PHP7 Nikolay Krapivnyy phpday.it, 2016

How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

  • Upload
    badoo

  • View
    493

  • Download
    8

Embed Size (px)

Citation preview

Page 1: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

How Badoo Saved $1M Switching to PHP7

Nikolay Krapivnyy

phpday.it, 2016

Page 2: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

About me✦ Nikolay Krapivnyy

✦ 10+ years PHP experience

✦ 5 years with Badoo, now backend team lead

✦ This is my first talk in English :)

Page 3: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

46languages

data

300Musers190

countries

“ BADOO IS THE LARGEST DATING NETWORK IN THE WORLD— Forbes

Page 4: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Badoo tech:

✦ 4 datacenters, ~3,000 servers overall

✦ up to 80,000 RPS for php backend

✦ ~200 engineers (~70 php devs)

✦ >2M PHP LoC

✦ and growing….

Page 5: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016
Page 6: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Today I will:✦ Share our practical experience

✦ Talk about some of our tools

✦ Tell you a million dollar story :)

Page 7: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

1. Problem 2. Transition 3. Results

Page 8: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

1. Problem

Page 9: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

DBs

CLOUD SERVICES

LTM

How it works:APP

HTTPHTTP

API

API

Page 10: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

9 %

15 %

22 %22 %

32 %phpmysqlotherphotosc/go

Hardware

Page 11: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

32% or 1000of our servers are running php

Page 12: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

PHP Cluster Growth

0

125

250

375

500

Jan, 2014 Jul, 2014 Jan, 2015 Jul, 2015 Jan, 2016

servers in 1DC users

Page 13: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

CPU is the main bottleneck for us

Page 14: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

How do we measure php performance?

Page 15: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Pinba!✦ Php is not a bottleneck anymore

✦ RT performance monitoring tool

✦ Extension for php + plugin for mysql

✦ Open source! http://pinba.org/

Page 16: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Request time

✦ Some API call: GET_USER

✦ avg request time = 0.12 sec

✦ request time = cpu time + i/o time

✦ i/o time = mysql + services + FS i/o +…

Page 17: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Pinba

Particular requests time

Page 18: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Pinba report

= +

Page 19: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Request time

✦ 0.12 sec = 0.07 (cpu) + 0.05 (i/o)

✦ 0.05 (i/o) = 0.012 + 0.05 + 0.03 + …

✦ 0.012 (memcache) = ~26*0.0005

✦ Realtime!

Page 20: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

CPU usage takes ~50% of our request time

Page 21: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

PHP7 alternatives?✦ HHVM (Facebook, http://hhvm.com/)

✦ kPHP (VK.com, https://github.com/vk-com/kphp-kdb)

+ JIT, PHP5 compatible— C++, extensions API

+ faster then HHVM

— no OOP support at all

Page 22: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

2. Transition

Page 23: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Platform team:✦ C developers

✦ Php developers

✦ Badoo infrastructure support

Page 24: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Transition steps:2.1. Extensions

2.2. Codebase

2.3. Deploy

Page 25: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

PHP7: extensions

xdebug

apcu

lua

imagick

✦ ~30 of them

✦ Already supported:

Page 26: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

PHP7: extensions

blitz

xhprof

handlersocketi

pinba

leptonica

tarantool

sphinx

memtrack

judy

&& 15 more…

Page 27: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

PHP7: extensions

https://github.com/tony2001

All php7 versions available:

Check for php7 branch

Page 28: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

We thought we were done, but…

Page 29: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Runkit

Page 30: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

What is runkit?

✦ runkit_method_add/redefine

✦ runkit_constant_add/redefine

✦ in runtime

✦ but why?

Page 31: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Unit testing!but why?

Page 32: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Unit testing:✦ 60K Tests now

✦ Coverage >50%

✦ Introduced only a few years ago

✦ Runkit: to isolate old code

Page 33: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Runkit: summary✦ essential for us

✦ no support for php7

Page 34: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Runkit for php7?✦ It`s different

✦ Alternatives? • UOPZ (https://github.com/krakjoe/uopz)

✦ Lots of changes anyway

Page 35: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Let`s remove this dependency

Page 36: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Soft mocks!✦ Soft means no extension

✦ Plain PHP, compatible with all PHP

✦ Replaces Runkit for us

✦ Open source! (https://github.com/badoo/soft-mocks)

Page 37: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

How it works:✦ Rewrites code on the fly

✦ Inserts "interceptors" in methods

✦ Wraps all constant usages

✦ Uses PHP-Parser

Page 38: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

1 require_once(__DIR__ . '/path.inc');2 ini_set(‘pinba.enabled', 1);3 echo RRD_BASE_PATH;

1 require_once SoftMocks::rewrite( ROOT_PATH . '/path' . '/path.inc' );2 SoftMocks::call( 'ini_set', array('pinba.enabled', 1’) );3 echo SoftMocks::getConst(‘RRD_BASE_PATH');

Original

After SoftMocks::rewrite()

Page 39: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

1 class A2 {3 public function getValue()4 {5 return 10;6 }7 }

1 class A2 {3 public function getValue()4 { if (SoftMocks::isMocked(A::class, __FUNCTION__)) { return SoftMocks::getResult(…); }

5 return 10;6 }7 }

Original

After SoftMocks::rewrite()

Page 40: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

So…

✦ No extension dependency

✦ 1.5 weeks for development

✦ A bit longer to adapt tests

✦ More stable tests in general

Page 41: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

https://github.com/YuriyNasretdinov

CreditsMore cool stuff:

Soft mocks:

https://github.com/badoo/soft-mocks

Page 42: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

2.2. Codebase

Page 43: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

php7mar

✦ https://github.com/Alexia/php7mar

✦ Migration Assistant Report

Page 44: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

php7mar 469 * foreachByReference 230 * oldClassConstructors 156 * funcGetArg 22 * hexadecimalString 19 * variableInterpolation 14 * yield 7 * deprecatedFunctions 4 * reservedNames 3 * arrayValueByReference

Page 45: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

2.3. Deploy

Page 46: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Deploy✦ Devel: separate sandbox

✦ Staging

✦ Production

Page 47: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Deploy: production ✦ Several hosts in each cluster

✦ Several weeks of quarantine

✦ CLI: OK, WEB: ERROR

✦ WEB: fix for opcache reset in FPM

Page 48: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

3. Results

Page 49: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

CPU usage

Page 50: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

cluster CPU usage

Page 51: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

memory usage

Page 52: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

We got: 2x CPU usage 9x memory usage

Page 53: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

✦ 700 servers running FPM

✦ 1/2 required

✦ ~$4K each

✦ 350*4K = $1,4M

Let's calculate

Page 54: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016
Page 55: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Links✦ Pinba: http://pinba.org/

✦ Soft mocks: https://github.com/badoo/soft-mocks

✦ php7mar: https://github.com/Alexia/php7mar

✦ php7 exts: https://github.com/tony2001

Page 56: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Summary:✦ PHP7 rocks!

✦ Know your bottleneck

✦ Find your way

✦ Share!

Page 57: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Grazie!

Page 58: How Badoo Saved $1M Switching to PHP7 - Nikolay Krapivnyy - PHPDay Verona 2016

Questions?

Twitter: @BadooTech

Blog: https://techblog.badoo.com

LinkedIn: https://linkedin.com/in/nkrapivnyy

Email: [email protected]

Joind.in: https://joind.in/talk/948d4