[英]Google App engine - understanding how instances are started and what memory is needed (Java)
我试图准确了解应用引擎如何为新请求启动新实例。 我已经使用应用程序引擎工作了一段时间,但我不知道哪里不知道文档(还没有完成我的“作业”)以及哪里存在错误/调度程序问题。
我刚刚尝试创建一个仅包含“Hello world”servlet 的新 Web 应用程序项目(Java - Eclipse)。 然后我将它部署到我的云控制台应用程序的测试版本上,以查看首次加载时需要多少内存。
有两个发现我不明白:
我的 appengine-web.xml 文件是:
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>[...]</application>
<version>test-memory</version>
<!--
Allows App Engine to send multiple requests to one instance in parallel:
-->
<threadsafe>true</threadsafe>
<!-- Configure java.util.logging -->
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<sessions-enabled>true</sessions-enabled>
<precompilation-enabled>true</precompilation-enabled>
<instance-class>F1</instance-class>
<automatic-scaling>
<min-idle-instances>1</min-idle-instances>
<max-idle-instances>2</max-idle-instances>
<min-pending-latency>350ms</min-pending-latency>
<max-pending-latency>automatic</max-pending-latency>
</automatic-scaling>
</appengine-web-app>
服务端代码:
public class TestAppEngineMemServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
resp.getWriter().println("Hello, world");
}
}
我使用 Java 1.9.42 SDK 进行了测试,并将 Java 8 用于具有 Java 编译器合规性级别 7(如果重要)、具有 F1 或 F2 实例类的标准环境的本地开发。
请指教,谢谢。
产生新实例的机制实际上非常简单。 您有待处理的延迟,即请求在由可用实例处理之前在队列中的时间。
如果待定延迟超过阈值,您指定将启动一个新实例。
现在你应该感兴趣的是每次启动新实例时都会发生的预热请求,因此需要更长的时间。
让我们假设你的测试是这样的
t+0s: request #1 (causes warmup since there is no instance yet)
t+1s: request #2 (causes warmup since the first instance is not there yet)
t+2s: ... you get where this is going ...
t+8s: the first instance is now ready to serve and requests are being processed
t+9s: the second instance is now ready to serve
t+xs: request #x (does not cause warmup requests because there are enough instances)
t+xs: instances slowly spin down because there isn't enough traffic to justify its existence
您在这里看到的是,您的请求不必同时引起看似愚蠢的行为。
至于内存(这真的应该是一个单独的问题):你看到的是容器/虚拟机使用的内存。 这大约是您的 Java VM 的内存 + 可能是容纳它的 docker 映像环境的一些样板。 Java 为运行时分配内存,因此与 C/C++ 相比,它总是相对较高(您可以使用 -Xms/-Xmx 参数在本地指定它)
所以内存不是必需的,而是分配给 JVM 使用的。 内存量可能会随着时间的推移而增加,但是当 JVM 中的内存被释放时,它不一定会立即返回给系统。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.