dynos/memory/processes 究竟是如何工作的?
How exactly do dynos/memory/processes work?
对于使用过 Heroku 的任何人(以及可能之前部署到 PaaS 并有经验的任何人):
我对 Heroku 所说的“dynos”、dynos 如何处理内存以及用户如何扩展感到困惑。我读到他们将 dynos 定义为“应用程序容器”,这意味着 dyno2 无法访问 dyno1 的 memory/file 系统。理论上说得通。
The containers used at Heroku are called “dynos.” Dynos are isolated, virtualized Linux containers that are designed to execute code based on a user-specified command. (https://www.heroku.com/dynos)
此外,如果我理解正确的话,用户可以通过 heroku ps:scale web=1
等命令定义实例化的测功机或“应用程序容器”的数量。
我最近创建了一个网络应用程序(一个 Flask/gunicorn 应用程序,如果这很重要的话),我在其中声明了一个变量来跟踪有多少用户访问了某条路线(我知道,这不是最好的方法,但无论如何都无关紧要)。在本地测试中,它似乎工作正常(即使对于多个客户端)
当我部署到 Heroku 时,只有一个 web dyno (heroku ps:scale web=1
),我发现情况并非如此,并且变量似乎有多个实例并且更新不同。我知道内存不在不同的测功机之间共享,但我只有一个运行服务器的测功机。所以我认为这个 variable/web 应用程序应该只有一个实例? dyno 运行 我的服务器是否在 single/multiple 进程中?如果可以,我该如何限制?
请注意,此网络应用程序确实将文件保存在磁盘上,并且通过每个 API 请求,我检查该文件是否存在。因为它确实如此,这告诉我我正在从同一个 dyno 请求。
谁能赐教?我是部署的初学者,但愿意 learn/understand 更多!
Is the dyno running my server on single/multiple processes?
Gunicorn forks multiple system processes within each dyno to allow a Python app to support multiple concurrent requests without requiring them to be thread-safe. In Gunicorn terminology, these are referred to as worker processes (not to be confused with Heroku worker processes, which run in their own dynos).
We recommend setting a configuration variable for this setting. Gunicorn automatically honors the WEB_CONCURRENCY environment variable, if set.
heroku config:set WEB_CONCURRENCY=3
The WEB_CONCURRENCY
environment variable is automatically set by Heroku, based on the processes’ Dyno size. This feature is intended to be a sane starting point for your application. We recommend knowing the memory requirements of your processes and setting this configuration variable accordingly.
解决方案不是限制您的进程,而是修复您的应用程序。 . Instead, store data in a database or in-memory data store.
Note, this web app does save files on disk, and through each API request, I check to see if the file does exist. Because it does, this tells me that I am requesting from the same dyno.
如果您只是想检查一下您使用的是哪台测功机,没问题。但是您可能不想将实际数据保存到 dyno 的文件系统中,因为它 is ephemeral. You'll lose all changes made to the filesystem whenever your dyno restarts. This happens frequently(每天至少一次)。
对于使用过 Heroku 的任何人(以及可能之前部署到 PaaS 并有经验的任何人):
我对 Heroku 所说的“dynos”、dynos 如何处理内存以及用户如何扩展感到困惑。我读到他们将 dynos 定义为“应用程序容器”,这意味着 dyno2 无法访问 dyno1 的 memory/file 系统。理论上说得通。
The containers used at Heroku are called “dynos.” Dynos are isolated, virtualized Linux containers that are designed to execute code based on a user-specified command. (https://www.heroku.com/dynos)
此外,如果我理解正确的话,用户可以通过 heroku ps:scale web=1
等命令定义实例化的测功机或“应用程序容器”的数量。
我最近创建了一个网络应用程序(一个 Flask/gunicorn 应用程序,如果这很重要的话),我在其中声明了一个变量来跟踪有多少用户访问了某条路线(我知道,这不是最好的方法,但无论如何都无关紧要)。在本地测试中,它似乎工作正常(即使对于多个客户端)
当我部署到 Heroku 时,只有一个 web dyno (heroku ps:scale web=1
),我发现情况并非如此,并且变量似乎有多个实例并且更新不同。我知道内存不在不同的测功机之间共享,但我只有一个运行服务器的测功机。所以我认为这个 variable/web 应用程序应该只有一个实例? dyno 运行 我的服务器是否在 single/multiple 进程中?如果可以,我该如何限制?
请注意,此网络应用程序确实将文件保存在磁盘上,并且通过每个 API 请求,我检查该文件是否存在。因为它确实如此,这告诉我我正在从同一个 dyno 请求。
谁能赐教?我是部署的初学者,但愿意 learn/understand 更多!
Is the dyno running my server on single/multiple processes?
Gunicorn forks multiple system processes within each dyno to allow a Python app to support multiple concurrent requests without requiring them to be thread-safe. In Gunicorn terminology, these are referred to as worker processes (not to be confused with Heroku worker processes, which run in their own dynos).
We recommend setting a configuration variable for this setting. Gunicorn automatically honors the WEB_CONCURRENCY environment variable, if set.
heroku config:set WEB_CONCURRENCY=3
The
WEB_CONCURRENCY
environment variable is automatically set by Heroku, based on the processes’ Dyno size. This feature is intended to be a sane starting point for your application. We recommend knowing the memory requirements of your processes and setting this configuration variable accordingly.
解决方案不是限制您的进程,而是修复您的应用程序。
Note, this web app does save files on disk, and through each API request, I check to see if the file does exist. Because it does, this tells me that I am requesting from the same dyno.
如果您只是想检查一下您使用的是哪台测功机,没问题。但是您可能不想将实际数据保存到 dyno 的文件系统中,因为它 is ephemeral. You'll lose all changes made to the filesystem whenever your dyno restarts. This happens frequently(每天至少一次)。