我正在使用一些多核模拟器,如GEMS或M5.在所有这些中都有一个"预热缓存"的选项.这个词是什么意思?
我正在尝试使用IIS 7.5应用程序初始化扩展来为我的Web应用程序配置预热过程.这是我采取的一种方法,旨在最大限度地减少应用程序池回收造成的缓慢下降,这是Stack Overflow上其他问题中解释的问题.
我想要的是获得应用程序初始化的好处,而无需在其他地方重新映射请求.
我按照IIS 8的说明进行了基本用例,效果很好!我创建了一个名为app_starting.htm的启动页面,通过使用此代码,它会在应用程序初始化时显示:
<applicationInitialization remapManagedRequestsTo="app_starting.htm" skipManagedModules="true" >
<add initializationPage="/" />
</applicationInitialization>
Run Code Online (Sandbox Code Playgroud)
我想使用初始化来加速对使用ASP.NET MVC编写的基于REST的Web服务的请求.此Web服务是多个应用程序的后端.当他们向资源(即/client/1/addresses)发出请求时,他们无法处理接收启动页面.
我删除了该remapManagedRequestsTo属性.但是,现在当我在初始化期间请求资源时,我得到500错误,直到初始化完成.之后,回复恢复正常.依赖于此服务的应用程序也不会很好地响应500错误,因为初始化不应该是错误条件.
在不执行任何重映射的情况下,我希望请求行为恢复正常.即使正在进行初始化,对应用程序的其他请求也应排队等待,直到初始化完成后.
有什么我想念的吗?我可以做到这一点吗?
谢谢您的帮助!
我们想热身IIS 7.5服务器上托管的ASP.NET MVC应用程序.以前在http://forums.iis.net/t/1176740.aspx上提供的预热模块已被删除.
每当IIS或ASP.NET工作进程因任何原因重新启动时,应该预热应用程序.在预热期间,IIS应返回一些HTTP状态代码,表示其预热状态或无法为任何客户端提供服务.
创建一个可执行文件,通过HttpRequests浏览网站中的必要页面是一个好主意吗?可执行文件可以从IProcessHostPreloadClient实现中触发.是否可以配置IIS以便它只接受来自localhost的请求,一旦可执行文件完成,它就可以切换到所有客户端 - 但是该交换机不应该触发IIS重启(显然).
是否可以使用Visual Studio 2010 - Web性能测试来预热应用程序而不是创建手动可执行文件?还有其他选择吗?
PS:应用程序使用表单身份验证并使用会话 - 因此维护状态cookie和其他cookie非常重要.
更新1 - 我们在我们的应用程序中使用.NET Framework 4.0和Entity Framework(数据库优先).首次点击EF查询的速度很慢.热身背后的原因是让这些第一次击中.我们已经在大多数地方使用了编译查询,并且已经为EF实现了预编译视图.模型和应用程序的大小非常大且复杂.预热需要遍历许多页面,以确保在任何最终用户访问应用程序之前至少执行一次编译和非编译的EF查询.
我有一个使用MySQL的电子商务应用程序,我希望它更快.当在之前访问过的网站上访问部件#时,部件会快速加载,因为所有必需的数据已经在INNODB缓冲池中.但是,如果之前从未加载过部分#,那么该数据还不在缓冲池中,因此需要从磁盘读取,这很慢.我将INNODB缓冲池设置为2GB,整个数据库只有350MB左右,因此有足够的空间在缓冲池中加载整个数据库.我可以从INNODB统计数据中看到,目前只使用了大约一半的缓冲池.
我发现了预加载数据的引用,也称为"预热"缓冲池,例如在缓冲池中快速预加载Innodb表或mysqldump.azundris.com/archives/70-Innodb-cache-preloading-使用-blackhole.html.该策略基本上涉及强制对每个表进行表扫描,因为MySQL没有用于预加载数据的本机方式.
我不想手动创建一个脚本来列出我的数据库中的每个表,并且必须这样做.如何创建一个脚本,并自动为每个表执行选择,并自动选取一个非索引列以执行表扫描?
我最近开始利用IIS的能力,通过使用IProcessHostPreloadClient界面将热身步骤应用到我的Web应用程序(请查看此处获取有关如何设置此内容的指导).这很好,或者至少我认为它确实如此,因为我所做的一个"聪明"的事情是尝试通过迭代我的控制器并渲染它们来预加载我的视图.
经过一些试验和错误,我得到了它的工作,一切都很顺利.也就是说,直到我注意到我的系统的所有验证都不再有效,无论是客户端还是服务器验证.我假设当MVC第一次检索视图时,验证通常会连接到视图,但我没有这样做.有没有人知道如何将其包含在我的解决方案中或者以其他方式完成?
代码:
public class Warmup : IProcessHostPreloadClient
{
public void Preload(string[] parameters)
{
//Pre-render all views
AutoPrimeViewCache("QASW.Web.Mvc.Controllers", @"Views\");
AutoPrimeViewCache("QASW.Web.Mvc.Areas.Api.Controllers", @"Areas\Api\Views\", "Api");
}
private void AutoPrimeViewCache(string controllerNamespace, string relativeViewPath, string area = null)
{
var controllerTypes = typeof(Warmup).Assembly.GetTypes().Where(t => t.Namespace == controllerNamespace && (t == typeof(Controller) || t.IsSubclassOf(typeof(Controller))));
var controllers = controllerTypes.Select(t => new { Instance = (Controller)Activator.CreateInstance(t), Name = t.Name.Remove("Controller") });
foreach (var controller in controllers)
{
var viewPath = Path.Combine(HostingEnvironment.ApplicationPhysicalPath, relativeViewPath + controller.Name);
var …Run Code Online (Sandbox Code Playgroud) 假设我有一个Java程序Test.class.我想测量它的执行时间.我写了一个包装器,如下所示:
class RunTest {
public static void main(String[] args) {
long sum = 0;
int iterations = 20;
int warmupNum = 10;
for(int i=0; i<iterations; i++){
long start = System.nanoTime();
Test.main(args);
long end = System.nanoTime();
if( i > warmupNum )
sum += end - start;
}
System.out.println("ave: "+sum/(iterations-warmupNum));
}
}
Run Code Online (Sandbox Code Playgroud)
在这里如何选择warmupNum,越大越好?多大就足够了?这是衡量Java程序性能的"标准/通用"方法吗?
我正试图消除(或至少最小化)我的.NET应用程序的启动/预热时间.即使这是一个普遍的问题,我也不确定如何做到这一点.
有关.NET应用程序启动缓慢的大量问题.这些很容易通过池循环,工作进程启动,.aspx文件的动态编译,JIT等来解释.此外,还有更多可能需要在应用程序中初始化的东西,如EntityFramework和应用程序缓存.
我发现了很多不同的解决方案,例如:
但是,我对上述任何解决方案都不满意.此外,我正在将我的应用程序部署到Azure网站(在大多数情况下),因此我对IIS的访问权限有限.
我知道有一些自定义的"热身脚本"使用各种方法向应用程序发送请求(例如wget/curl).我的想法是在我的每个ASP.NET应用程序中创建一个"Warmup.aspx"页面.然后我有一个热身服务,每隔5分钟就会向每个站点的Warmup.aspx发送一个HTTP GET.此服务可以是Azure中的WorkerRole,也可以是内部部署安装中的Windows服务.Warmup.aspx将执行以下操作:
所以,我的最后一个问题是,是否有比"Warmup.aspx"脚本更好的选择?这是一个好方法还是你推荐其他方法?我真的想要一些能够处理上述标准的官方方法.
欢迎任何和所有建议,谢谢!
我有一个简单的Umbraco 7.7.2应用程序,我在Azure(app-service)上托管它.当我重新启动服务器时,第一次请求一个非常烦人的页面需要20-40秒,特别是当负载很高时,你需要缩小以减少响应时间.
我在webconnfig中尝试过这个设置,但它似乎不起作用.
<system.webServer>
<applicationInitialization>
<add initializationPage="/page1/?warmup=1" hostName="mydomain.com" />
<add initializationPage="/page1/page2/?warmup=1" hostName="mydomain.com" />
</applicationInitialization>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
我可能会以错误的方式尝试它,但我做的是重新启动服务器,我已经离开它2-3分钟而没有请求任何页面.
我检查了我的Umbraco日志,应用程序甚至没有启动.然后我已经请求了主页,它花了40秒才出现.
然后我尝试了mydomain.com/page1,它也花了20秒,因为它是第一个访问它的请求.
*PS:第一次请求后,网站速度非常快,每页加载时间不到100毫秒
我已经实现了重写以阻止下一次重定向,正如Kevin建议的那样.结果,我的Umbraco将启动,但请求仍然没有到达页面.
在我的母版页,我添加了一行写在日志中的线路,如果它在查询字符串的热身和它的作品在页面从浏览器hitted:
if (!string.IsNullOrWhiteSpace( Request.QueryString["warmup"]))
{
var pageC = Model.Content;
logger.Info(pageC.UrlAbsolute()+" "+ Request.QueryString);
}
Run Code Online (Sandbox Code Playgroud)
但是,我的日志中没有任何内容
2018-02-08 15:16:51,245 [P7036/D2/T1] INFO Umbraco.Core.CoreBootManager - Umbraco应用程序启动完成(耗时12727ms)2018-02-08 15:16:54,911 [P7036/D2/T1] INFO MyNamespace.Web.CustomStartup - 基本配置完成!
这是我根据Kevin的回答添加的混淆:
<rule name="No redirect on warmup request (request from localhost with warmup user agent)" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{REMOTE_ADDR}" pattern="127.0.0.*" />
</conditions>
<action type="Rewrite" url="{URL}" />
</rule>
Run Code Online (Sandbox Code Playgroud)
另外,我在微软上发现了另一个类似的配置: …
我有一个模型,严格要求预热时间 = 2s。现在运行速度对我们来说还可以。
我已经尝试设置
tf.env().set('WEBGL_EXP_CONV', true)
tf.env().set('WEBGL_USE_SHAPES_UNIFORMS', true)
Run Code Online (Sandbox Code Playgroud)
我打开了并行着色器编译。但还有4s左右的时间。每个张量形状的单独着色器有助于加快运行时间,但会减慢预热过程,因为导致着色器数量增加。
是否有当前可能的改进的完整列表可供检查,我错过了什么?
我的环境 Windows + Intel 嵌入式 GPU(但 MacOS 也在目标平台之列)