take a walk on the ops side - php tour 2014
TRANSCRIPT
Take a walk on The OPS side
Présenté par @bdu_p au PHP Tour à Lyon le 23 Juin 2014
BOFH
• Sysadmin depuis 4 ans @ M6Web • <3 Forte Charge, Data, (No)SQL, systèmes distribués • Fournisseur officiel de chats animés et fan de BDLV
Qui suis-je ?
M6 Web• ~ 30 Sites • Catchup TV • 60 Millions de vidéos vues / mois • Portails Thématiques • Sites de chaines !
• En propre dans 2 DC + cloud • AS 30972
SysAdmin
comment mes amis me voient
comment les devs me voient
SysAdmin
comment je me vois
SysAdmin
la réalité
SysAdmin
localhost
prod
Les 40 Prochaines minutes
Debugger PHP sans PHP
Surveiller et mesurer
Donner du sens à ses logs
Bencher son applicatif
Nos Outils
puppet
capistrano zshtop
jgrepmcollective
tcpdumpsysdig
brew reprepronginx
varnish
rsync
dig
curl
wget
gdb
netcatngrep
nmap
numactlpbzip2
pigz
socat lftp
smemmtr
systat
vim
rabbitmq
cacti
sensu
logstash
seyren
statsd
graphite
collectd
haproxy
keepalived
nodejs
stunnel redis
percona-toolkit
unbound
nsd
postfix
memcachedelasticsearch
pssh
ntpd
rsyslog
iptables
kibana
ptrace iostatvmstat
git
github
jenkins
Anemometer
phppython
go
lua supervisor
emacs
perl
fio
oprofile
perf
jmeter
ab
curl-loaderruby
zfs
sar
R
egrep
mpstat
ss
ack
iotopldap
nfs
samba
ubuntu
svn
hipchat
jabber
rake
chefbackuppc
docker
• « Sans maitrise la puissance n’est rien » (Pneus Pirelli)
• « T’es dingue, c’est une truelle ça loulou » (V. Damidot) A.K.A The right tool for the right job
• Keep It Simple and Stupid
• Sublimer les silos (Kenny Dits)
• Partager !
Nos Outils Principes
Debugger PHP sans PHP
« On va dédupliquer les clics par quatre »
Un dev
• Mais que fait php / mon code ?? • Couteau suisse du debug système • Connections réseau, appels systèmes, fichiers ouverts,
requêtes Redis, SQL, partenaires externes…
Debugger PHP sans PHP - SysDig
Debugger PHP sans PHP - SysDigExemple: Curl Sans Timeout !
<?php$c = curl_init();// will never workscurl_setopt($c,CURLOPT_URL,"1.1.1.1");$output = curl_exec($c);curl_close($c);?>
[dev] ~ sysdig -w php.scap
Enregistre tous les events du système <!>
[dev] ~ sysdig -r php.scap proc.name=php
Relit la capture, filtre par processus
Debugger PHP sans PHP - SysDigExemple: Curl Sans Timeout !
[dev] ~ sysdig -r php.scap proc.name=php!
open fd=-2(ENOENT)name=/usr/bin/php-cli.ini flags=1(O_RDONLY) mode=0
Debugger PHP sans PHP - SysDigExemple: Curl Sans Timeout !
10:26:01 php < connect res=-115(EINPROGRESS) tuple=10.210.1.54:54365->1.1.1.1:80!
10:26:01 php > poll fds=4:4204 timeout=1000….10:27:04 php > close fd=4(<4t>10.210.1.54:54365->1.1.1.1:80)
Debugger PHP sans PHP - SysDigExemple: Curl Sans Timeout !
[dev] ~ sysdig -r php.scap proc.name=php
[dev] ~ sysdig -A proc.name=php5-fpm and evt.buffer contains GET!
Debugger PHP sans PHP - SysDigExemple: Redis / SQL Live
10:43:31 php5-fpm (26697) < sendto res=44 data=*2$7HGETALL$20polls:answers:140855
11:47:17 php5-fpm (27000) < sendto res=125 data=SELECT GZDATA, DATASIZE, DATACRC, EXPFROM col1WHERE CACHEKEY = 'fed29489560a7f3d76cc0a0e1721374d'!
!
Debugger PHP sans PHP - SysDigExemple: Redis / SQL Live
[dev] ~ sysdig -A proc.name=php5-fpm and evt.buffer contains SELECT
Debugger PHP sans PHP - Curl
Tu n’as pas regardé les headers HTTP ?
Debugger PHP sans PHP - Curl
[dev] ~ curl -Iv www.clubic.com -s | sort
Connection: keep-aliveContent-Length: 268732Content-Type: text/htmlDate: Sat, 21 Jun 2014 10:14:53 GMTETag: "2681546616.268732"HTTP/1.1 200 OKServer: Cobol Server 2.0Vary: Accept-Encoding
Age: 11Via: 1.1 varnishX-Backend-Ip: 10.210.10.2X-Backend-status: 200X-Cache-Hits: 2X-Cache-Host: m6w-cache1X-Cache-IP: 141.138.91.59X-Cache-ttl: 60.000X-Cache: hitX-Varnish: 2185275681X-Your-IP: 127.0.0.1
Debugger PHP sans PHP - Curl
Forcer le header Host -H "Host: www.clubic.com" http://127.0.0.1
Changer la méthode http -X [GET|POST|PUT|DELETE] http://127.0.0.1
Forcer le User-Agent -H "User-Agent: Cobol Browser"
Envoyer-Sauver les cookies -[b|c] mesCookies.log
Modifier la résolution DNS —resolv www.clubic.com:80:127.0.0.1
Surveiller et mesurer
« On a doublé la bande passante par dix »
Un autre dev
Graphite • Stocke des données temporelles et affiche des graphs • Python, multiples démons
Statsd • Agrège des métriques puis les flush à Graphite • NodeJS • UDP, Fire & Forget
610.525 Métriques dans graphite + 100 dashboards
~ 32.000 dans Cacti
Surveiller et mesurer
Collectd • Récupère les données systèmes (CPU, RAM, I/O, Network) • C, Plugin output vers Graphite/Statsd
Sensu • Framework de monitoring distribué • Modèle Agent - Serveur basé sur RabbitMQ • Scalable, flexible
Surveiller et mesurer
Seyren • Alerting basé sur des seuils Graphite • In = Noeuds Graphite, Out = HipChat, Mail, HTTP
Surveiller et mesurer
Un outil simple = (input + output) Plein d’outils simples = pipeline
Surveiller et mesurerServeurs
Applicatif
Graphite
Grafana
Seyren
Mayday
Oculus Kale
Riemann
HipChat
HTTP
BotMySQL
Redis
Datas Collecte Reporting
RabbitMQ
Alerting Messages
Scripts
LogStashDeploy
Jenkins
Varnish
Statsd
Ticketing
CEP
Surveiller et mesurer
Serveurs HipChat
HTTP
MySQL
Redis
RabbitMQ
LogStashPing HTTP
SensuGraphite
Ticketing
RabbitMQ
Surveiller et mesurer
« Le monitoring applicatif, pourquoi ? comment ? »
« Symfony à la télé »
Kenny Dits
Olivier Mansour
Donner du sens à ses logs
« C’est un environnement de dev même en prod ! »
Anon.
Donner du sens à ses logs
Mais il faut : • Ecrire au bon format (json, csv, |, bin ? ) • Stocker au bon format (text, pigz, bz2, gzip, snappy ? ) • Traiter (synchrone / asynchrone)
Pourquoi s’intéresser aux logs ? • En tirer des infos ! • Comprendre un incident • Vérifier un comportement • Déclencher un événement
Donner du sens à ses logs$host $upstream_cache_status $upstream_response_time $msec $request_time $remote_addr $request $request_method $time_local $scheme $uri $query_string $sent_http_content_type $status $bytes_sent $http_referer
$http_user_agent $http_x_forwarded_for $ssl_cipher $ssl_protocol $http_x_flash_version $http_x_playback_session_id $sent_http_location $tcpinfo_rtt $tcpinfo_rttvar $tcpinfo_snd_cwnd $tcpinfo_rcv_space $geoip_country_code $geoip_city $geoip_latitude $geoip_longitude $geoip_org
Donner du sens à ses logs
Logs HTTP: Roadster Logs PHP: Script Python Logs MySQL: Anemometer Logs Firewall / SysLog: RSyslog Central Logs Dev: ELK
~ 450 / 700 millions de lignes de log par jour ~ 50% d’infos utilisées
Donner du sens à ses logs
ElasticSearch Moteur de recherche REST et distribué
Logstash Input => ( Parser | Filter ) => Output JRuby, ~ 100 plugins
Kibana Interface client AngularJS
Donner du sens à ses logs
Donner du sens à ses logs
Stack ELK • WIP @ M6Web • Durée de rétention des logs • Nombre et taille des messages /s • Shipper Leger ! Logstash Forwarder • Sense + Kopf • grokdebug.herokuapp.com
Et si je n’ai pas de stack ELK ? Je veux juste analyser quelques logs…
Donner du sens à ses logs
R • Outil et langage pour les stats, le machine learning etc.. • Input = Logs, SQL, CSV… • Excel du Hipster • Ponctuel, pas automatisé
Usages • Filtrer les appels lents • Avoir les stats des pages les moins cachées • Histogramme des tailles d’objets • Latences par F.A.I
Temps de génération PHP
Latence selon les FAI
Bencher son applicatif
« No pain, No gain »Michael Bay
Bencher son applicatif
Au moment où vous passerez sur Capital :)
Bencher son applicatif
Tests de Charge • Est-ce que l’infra va tenir avec 50K utilisateurs concurrents ? • avec 200K ? 500K ? • Scénario VS APIs
Tests de stress • Jusqu’où on peut tenir ? • Quel est le premier goulot d’étranglement ?
Tests de performances • WebPerf / Expérience utilisateur • Qu’est-ce qui est acceptable ?
Bencher son applicatifJmeter / Gatling Communauté, reporting, flexibilité, scalabilité, API
Siege / Wrk Tests simples et rapides
Tsung Pour tous les tests (MySQL, XMPP, LDAP, WebSocket, MQTT) Pour frimer en erlang
SaaS Blitz.io, Blazemeter, Neotys
gor Réplique le traffic en temps réel + throttling
? Questions ?tech.m6web.fr@bdu_p
@tech
@techM6Web