Je ne m'attendais pas à ce que le calendrier de l'Avent dans notre laboratoire se termine en toute sécurité. Cette fois, j'écrirai sur le problème de mémoire de Splash.
** Si vous mangez trop de mémoire, elle tombera sans permission, alors redémarrez **
J'ai écrit un article avant Scrapy is good. Mais Scrapy a un problème. Autrement dit, bien sûr, JavaScript ne fonctionne pas. Un outil appelé Splash est souvent utilisé lors du scraping de pages utilisant JavaScript avec Scrapy.
Splash est un serveur qui rend JavaScript, et vous pouvez obtenir la source après avoir exécuté JavaScript du site spécifié en y accédant à l'aide de l'API Web. Le contenu est écrit en Python et semble utiliser Twisted et QT3.
Un Splash aussi pratique a un gros problème. Cela consomme beaucoup de mémoire. La figure ci-dessous est un graphique de la consommation de mémoire de Splash. Plus vous faites de demandes, plus vous consommerez de mémoire. Dans ces conditions, quelle que soit la quantité de mémoire chargée, elle disparaîtra en un clin d'œil. Il y a un problème similaire sur Github, mais il semble que la spécification Python n'autorise pas de mémoire libre. https://github.com/scrapinghub/splash/issues/674
Le problème avec Python est intouchable. Si quelqu'un sait, faites-le moi savoir. Comme mentionné dans le problème ci-dessus, le seul moyen de libérer de la mémoire est de supprimer Splash une fois. Cependant, Splash ne peut pas être supprimé manuellement, il doit donc être supprimé automatiquement. Il est difficile d'écrire un script comme redémarrer toutes les minutes avec cron, mais c'est gênant. Que dois-je faire dans un tel cas?
** Attendez qu'il tombe en raison d'un manque de mémoire. Et redémarrons automatiquement **
Ce n'est pas une solution très intelligente, mais c'est la plus simple.
Ciblez les situations suivantes.
Tout d'abord, définissez la limite supérieure de la mémoire que le conteneur Docker de Splash peut utiliser. Pour docker-compose, utilisez 2 car mem_limit
a disparu de la version 3.
Ajoutez également restart: always
pour qu'il redémarre automatiquement quand il tombe.
version: "2"
services:
splash:
image: "scrapinghub/splash:3.3"
ports:
- "8050:8050"
mem_limit: 2g
restart: always
command: --disable-browser-caches --maxrss 4000
Maintenant, vous ne mangez plus de mémoire que nécessaire
Comme je l'ai dit au milieu, ce n'est pas une solution très intelligente. S'il vous plaît laissez-moi savoir s'il existe une façon plus intelligente et plus simple de le faire.
Recommended Posts