Aller au contenu

Utilisation des Ressources

Le conteneur Docker Apprise API utilise-t-il plus de RAM ou de mémoire que prévu ? Le tableau ci-dessous associe votre niveau d’utilisation aux réglages adaptés. Pour la plupart des déploiements personnels et hobbyistes, quelques variables d’environnement suffisent.

ProfilNotifications quotidiennesAPPRISE_WORKER_COUNTAPPRISE_WORKER_MAX_REQUESTSRAM attendue
Hobbyiste1 – 50150~150–180 MB
Léger51 – 5001200~180–220 MB
Moyen501 – 5,0002500~330–400 MB
Lourd5,001 – 20,0003–41000 (par défaut)~500–700 MB
Très élevé20,000+(auto)1000 (par défaut)variable

Voici un exemple de la manière dont vous pouvez appliquer ces paramètres à votre déploiement. Choisissez l’onglet correspondant à votre configuration.

Fenêtre de terminal
docker run --name apprise \
-e APPRISE_WORKER_COUNT=1 \
-e APPRISE_WORKER_MAX_REQUESTS=50 \
-p 8000:8000 \
-v ./config:/config \
-d caronc/apprise:latest

Le conteneur exécute toujours trois processus, quels que soient les réglages :

ProcessusRAMNotes
Nginx~25 MBReverse proxy
Supervisord~10 MBGestionnaire de processus
Gunicorn worker~115–145 MBPython + Django + tous les plugins Apprise

Le worker est le principal poste de dépense. Apprise charge les 137 services de notification au démarrage même ceux que vous n’utiliserez jamais. C’est ce qui crée ce socle fixe. Le cœur Python, Django et l’infrastructure de services sont toujours chargés ; en revanche, certaines bibliothèques tierces optionnelles utilisées uniquement par des services spécifiques peuvent être évincées au démarrage si ces services sont désactivés (voir Réduire davantage la mémoire avec le filtrage de services).

Le nombre de workers par défaut vaut (2 × nombre de cœurs CPU) + 1. Sur une machine à 2 cœurs, cela fait 5 workers, ce qui peut pousser l’utilisation mémoire à 700 MB ou plus avant même l’envoi d’une seule notification. Réduire à APPRISE_WORKER_COUNT=1 est le levier le plus efficace.

Pourquoi la mémoire augmente-t-elle avec le temps ?

Section intitulée « Pourquoi la mémoire augmente-t-elle avec le temps ? »

L’allocateur interne de Python conserve une partie de la mémoire libérée au lieu de la rendre immédiatement au système d’exploitation. C’est normal, pas forcément une fuite. La mémoire n’est complètement relâchée que lorsqu’un worker redémarre.

APPRISE_WORKER_MAX_REQUESTS contrôle combien de requêtes un worker traite avant de redémarrer. Avec la valeur par défaut 1000 et seulement quelques notifications par jour, les workers peuvent rester actifs pendant des mois sans recyclage. Définir une valeur plus basse (par exemple 50) garantit des redémarrages périodiques qui maintiennent la mémoire plus proche du niveau initial.

APPRISE_WORKER_MAX_REQUESTS_JITTER ajoute un décalage aléatoire au seuil de redémarrage de chaque worker afin d’éviter qu’ils se recyclent tous en même temps.

  • Déploiements à un seul worker : le jitter n’a pas d’effet. La valeur par défaut 50 est sans danger, ou vous pouvez la fixer à 0.
  • Déploiements à plusieurs workers : laissez le jitter à sa valeur par défaut 50, ou réduisez-le proportionnellement si vous baissez fortement APPRISE_WORKER_MAX_REQUESTS (par ex. MAX_REQUESTS=50JITTER=10).

Le jitter n’affecte pas l’usage mémoire ; seuls APPRISE_WORKER_COUNT et APPRISE_WORKER_MAX_REQUESTS ont un impact direct.

VariableDéfautDescription
APPRISE_WORKER_COUNT(2×CPUs) + 1Nombre de workers Gunicorn. Réglez à 1 pour les déploiements à faibles ressources.
APPRISE_WORKER_MAX_REQUESTS1000Nombre de requêtes avant redémarrage d’un worker et libération de la mémoire accumulée.
APPRISE_WORKER_MAX_REQUESTS_JITTER50Décalage aléatoire par worker pour étaler les redémarrages. Sans importance avec un seul worker.
APPRISE_WORKER_TIMEOUT300Timeout du worker en secondes.

Consultez la référence des variables d’environnement pour la liste complète.

Avancé : réduire davantage la mémoire avec le filtrage de services

Section intitulée « Avancé : réduire davantage la mémoire avec le filtrage de services »

Si vous n’utilisez qu’un petit ensemble de services de notification, vous pouvez récupérer encore un peu de mémoire en indiquant à l’API quels services vous utilisez réellement. L’API Apprise évincera alors au démarrage les bibliothèques optionnelles utilisées exclusivement par les plugins désactivés.

Fenêtre de terminal
APPRISE_ALLOW_SERVICES=tgram,ntfy

Les bibliothèques dont plus aucun plugin activé n’a besoin sont automatiquement supprimées du cache de modules Python (sys.modules). Les gains s’additionnent avec APPRISE_WORKER_COUNT=1 :

BibliothèqueUtilisée ParMémoire Libérée
slixmppxmpp://~20 MB
pahomqtt://~4 MB
gntpgrowl://~2 MB
smpplibsmpp://, smpps://~2 MB
hidblink1://~2 MB
pgpymailto://, mailtos:// (PGP uniquement)~10 MB
cryptographysimplepush://, fcm://, vapid://partielle†

cryptography s’appuie nativement sur OpenSSL. Les objets d’encapsulation Python sont libérés, mais la bibliothèque partagée sous-jacente reste chargée par le système d’exploitation pendant toute la durée de vie du processus.

Pour tous les détails sur le fonctionnement et des exemples de configuration, consultez Impact mémoire du filtrage de services.

Questions ou commentaires ?

Documentation

Vous avez repéré une faute de frappe ou une erreur ? Signalez-la ou proposez une correction .

Problèmes Techniques

Vous rencontrez un problème avec le code ? Ouvrez un ticket sur GitHub :

Conçu avec amour depuis le Canada