Je n'ai pas eu le temps de regarder la source, mais voici quelques commentaires :
Question 1. Avec un serveur aussi puissant, pourquoi le système d'exploitation ne fournirait-il pas une telle mémoire à l'application (c'était la seule application en cours d'exécution) ?
Parce que la machine virtuelle Erlang a essayé de consommer plus que la mémoire libre disponible.
Question 2. L'émulateur Erlang que je démarre est chargé de pouvoir générer autant de processus que nécessaire. la valeur +P 13421779. Est-ce que la VM Erlang n'accède pas à cette mémoire ou ne l'alloue pas à ses processus ?
Non. Si vous étiez à court de processus, la machine virtuelle Erlang l'aurait dit (et la machine virtuelle serait toujours opérationnelle) :
=ERROR REPORT==== 18-Aug-2011::10:04:04 ===
Error in process <0.31775.138> with exit value: {system_limit,[{erlang,spawn_link, [erlang,apply,[#Fun<shell.3.130303173>,[]]]},{erlang,spawn_link,1},{shell,get_command,5}, {shell,server_loop,7}]}
Question 3. Pour Solaris, il voit un processus :epmd, peut-être contenant et démarrant des milliers de micro threads. Quelles configurations peut-on faire à Solaris pour ne jamais arrêter mon application aussi " gourmande en mémoire " soit-elle ? L'espace d'échange disponible est de 16 Go, la RAM de 20 Go, honnêtement, il doit y avoir quelque chose qui ne va pas.
epmd
est le démon de mappage de port Erlang. Il est responsable de la gestion d'Erlang distribué et n'a rien à voir avec votre application Erlang individuelle. Les processus que vous devriez rechercher seront nommés beam.smp
probablement. Ceux-ci montreront la consommation de mémoire du système d'exploitation de la machine virtuelle Erlang, etc.
Question 4. Quelles configurations puis-je apporter à l'émulateur Erlang, pour éviter ces vidages sur incident de mémoire de tas, en particulier lorsque toute la mémoire dont il peut avoir besoin est disponible sur le serveur ? Comment vais-je exécuter plus d'applications consommatrices de mémoire sur ce serveur si Erlang ne parvient toujours pas à allouer une telle mémoire à un simple indexeur de système de fichiers (enfin, c'est fortement simultané) ?
La machine virtuelle Erlang devrait pouvoir utiliser toute la mémoire disponible sur votre machine. Cependant, cela dépend de la façon dont votre application est écrite. Les fuites de mémoire peuvent avoir plusieurs raisons :
- Remplissage de la table des atomes (vous créez trop d'atomes uniques)
- Les tables ETS ou Mnesia ne sont pas ramassées (vous ne supprimez pas les anciens éléments inutilisés)
- Pas assez de mémoire pour les processus (vous générez trop de processus)
- Trop de fichiers binaires sont créés (vous pouvez conserver des références inutilisées à d'anciens fichiers binaires)