[PYTHON] Réponse au problème de la surutilisation de la mémoire Splash (brouillon)

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.

Conclusion

** Si vous mangez trop de mémoire, elle tombera sans permission, alors redémarrez **

Qu'est-ce que c'est

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.

problème

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. Image from Gyazo 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

Solution

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.

Que faire

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

À la fin

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.

Site référencé

Recommended Posts

Réponse au problème de la surutilisation de la mémoire Splash (brouillon)
Réponse à "Comment écrire le problème F04 en temps réel hors ligne"
Réponse à "Comment écrire le problème F05 en temps réel hors ligne"
Réponse à "Comment écrire un problème E12 en temps réel hors ligne"
Réponse à "Comment écrire le problème F02 en temps réel hors ligne"
Réponse à "Comment écrire un problème F01 en temps réel hors ligne"
Réponse au "Problème d'écriture en temps réel hors ligne E13"
[Python] Essayez de lire la bonne réponse au problème FizzBuzz