On 09/11/2012 11:45, François wrote:
Pour vous opérateurs, ça change quelque chose le modèle push serveur
-> client (et donc le fait d'avoir des connexions persistantes)? Le
fait d'avoir des (dizaines de) milliers de clients qui se connectent
(donc suivant une répartition aléatoire sur une période temporelle)
vers une même destination, plutôt que d'avoir ce même (dizaine de)
millier de connexions ouvertes?
D'un point de vue réseau, ce qui compte c'est le nombre de paquets.
De ton point de vue, plus de sessions c'est aussi plus de charge sur les
serveurs et les firewalls (si statefull). Mais coté serveur ça va
dépendre des implémentations, puisqu'une ouverture de session peut
consommer plus que le maintient de plus de connexions ouvertes.
La question va plutôt être de savoir si tu as besoin de plus de paquets
pour le keepalive que pour le triple handshake (supposant que tu fais du
HTTP, donc du TCP) à chaque ré-ouverture de session.
J'aurais tendance à favoriser le keepalive et le pipelining dès que
l'applicatif le permet et dans l'espoir de maximiser la charge utile des
paquets.
Mais quitte à pousser la réflexion à ce stade, l'idéal est encore que
tout l'applicatif soit optimisé : sérialisation, minimisation et
compression de ce qui peut l'être, vrai gestion statefull des clients
connectés, gestion de reconnexion transparente en cas de perte de la
session malgré le kepalive...
Dans ce cas un des points d'optimisation peut être la spécialisation de
tes serveurs. Tu vas avoir différents rôles prédéfinis et différents
comportements pour chaque rôles, avec des heuristiques à implémnter dans
ton applicatif pour optimiser encore plus le comportement de ces rôles.
Le cas typique de mon point de vue c'est le jeu et ligne ou le site
social / de rencontre avec t'chat.
La première distinction que tu peux faire, c'est statique v;s.
dynamique. Sur le statique, ton objectif va être de profiter du
pipelining, et ce qui va compter c'est la capacité de ton sous-système
de stockage à accéder à tous les fichiers dans le délai du keepalive
(parfois les 5 secondes par défaut d'Apache ne suffisent pas, mais
quelle idée d'utiliser apache pour du statique ?).
Ensuite dans le dynamique, tu vas avoir la génération des pages et le
support de tes messages applicatifs. Sur la génération des pages, tu vas
généralement n'avoir qu'un fichier à envoyer par requête, et les
requêtes sont plutôt espacées, donc le keepalive ne sert à rien.
Par contre sur la classe de serveurs qui va supporter la messagerie
instantanée, tu as intérêt à l'augmenter au maximum dès qu'une
conversation est active. Ou plutôt que ton code coté client n'initie la
connexion que lorsqu'une conversation est effectivement démarrée.
Sur un site un peu gros, pour le coup tu vas plutôt avoir 4 à 6 familles
de serveurs frontaux :
- Les statiques invariables (images) : ce sont les I/O disque random
read qui chargent. Keepalive pour pipelining.
- Les statiques légèrement variables (js, css) : tu vas bouffer un peu
de CPU si tu ne pré-compresse pas, mais finalement tout le contenu se
retrouve en RAM, donc peu d'IO disque. Keepalive pour pipelining.
- Les dynamiques lourds (html) : ceux là tapent dans les bases pour
génerer uniquement l'ossature et agréger le contenu que tu auras
considéré comme statique. Pas de keepalive.
- Les dynamiques légers (html aussi, parfois json ou xml) : ceux là vont
générer des inclusions plus variables, genre le "top 5 instantané" ou la
liste des connectés. Per request uniquement, pas de keepalive.
- Les flux de contrôle par session (json ou autre) : ouverts pour tout
le monde, pour les notifications quelconques, pas forcement très
réactives donc un keepalive court et du polling toutes les 2-3 minutes
peut suffire
- Les flux applicatifs real-time (json ou autre) : là c'est spécialisé
pour la messagerie instantanée, les données de jeu en ligne, ...).
Keepalive long obligatoire.
Sur chaque famille tu vas avoir des profils de requêtes par utilisateur
assez différents pour avoir des optimisations adaptées à chaque
scénario, et donc faire un meilleur usage du keepalive pour gagner en
réactivité et minimiser la charge de tes serveurs.
Le fait de découper les serveurs par fonction de permettra aussi de
scaler et distribuer la charge (sous entendu en CDN et/ou sur plusieurs
hébergeurs) plus facilement.
@+
--
Jérôme Nicolle
06 19 31 27 14
---------------------------
Liste de diffusion du FRnOG
http://www.frnog.org/