Lancer plusieurs processus qui prennent plusieurs jours sur un petit serveur avec 4 CPU et 4 G Lorsque je calculais avec 100% CPU x 4, j'ai manqué de mémoire en quelques heures. L'utilisation du processeur a fortement chuté. Apparemment, je manquais de mémoire.
Augmentation du temps de traitement Nitomonai, augmentation de l'utilisation de la mémoire de processus → Épuisement de la mémoire → Un échange de mémoire se produit → La vitesse d'accès à la mémoire se détériore considérablement → La mémoire en attente d'utilisation du processeur est de 1% ou moins → Ça ne s'arrête jamais (dégradation significative des performances)
Dans la plupart des cas, augmenter le nombre de serveurs ou améliorer les performances des serveurs résoudra le problème. Je ne l'ai pas sélectionné car c'était un PJ personnel, mais quand je suis passé à un serveur avec une mémoire d'environ 32G Je me demande si c'était la seule solution.
La gestion de la mémoire de python est entièrement automatique, la laissant à la VM de base. La seule solution à la fuite de mémoire est de tuer le processus Nous avons divisé les parties qui traitaient 8 types de catégories avec une commande, donnant l'égalité de traitement.
class Category(Enum):
A = 1
B = 2
C = 3
for category in Category:
benchmark(category)
category = manage.get_category_by_priority()
benchmark(category)
Le code d'amélioration 1 devait être exécuté en 8 étapes, donc si le processus s'arrêtait Il a fallu recommencer. Il est pratique d'utiliser le superviseur dans un tel cas
shell
easy_install supervisor
echo_supervisord_conf > /etc/supervisord.conf
supervisord
supervisord status
alias sc='supervisorctl'
sc restart
sc reread
sc stop all
sc status
sc restart all
Je ne suis pas familier avec le GC de python, il peut donc avoir des effets secondaires. Jusqu'à présent, la fuite de mémoire a été résolue et elle est stable. Il y a une possibilité de magie noire, donc je ne peux pas le recommander beaucoup.
Si vous utilisez beaucoup de cache de classe, des fuites de mémoire se produisent fréquemment dans la série python2. Python3 résoudra-t-il le problème de l'augmentation constante de la consommation de mémoire?
class Category(Enum):
A = 1
B = 2
C = 3
for category in Category:
benchmark(category)
def benchmark(category):
bulk = []
tmp_data = Tmp.get_all()
for _tmp in tmp_data:
bulk.append(calc(_tmp))
DBTable.bulk_create(bulk) #Masse!
#Libération de la mémoire
import gc
del tmp_data
del bulk
gc.collect()
Référence: gc - Interface du garbage collector http://docs.python.jp/2/library/gc.html
Recommended Posts