在负载均衡的服务器设置中,我们的UmbracoLog表正在接收大约50条记录,每秒写入所有记录都遵循相同的模式(格式化道歉)
**id userId NodeId Datestamp logHeader logComment
1122069437 0 -1 41302.1891 System Submitting calls to distributed servers
1122069438 0 -1 41302.1891 Custom http://www.url.com/umbraco/webservices/cacheRefresher.asmx
1122069439 0 -1 41302.1891 System Submitting calls to distributed servers
1122069440 0 -1 41302.1891 System Distributed server push completed with no nodes reporting an error
1122069441 0 -1 41302.1891 System Distributed server push completed with no nodes reporting an error
1122069442 0 -1 41302.1891 Custom http://www.url.com/umbraco/webservices/cacheRefresher.asmx**
在24小时内,这会产生一个6.9GB的表和一个在CPU和内存使用方面持续运行的数据库。
我们检查了其他类似网站设置的web.config和umbraco.config设置文件,并且在配置方面没有差异。
我们可以禁用系统级日志记录,但我们会丢失其他有意义的消息。
任何人都可以帮助解决此问题吗?
TL; DR Umbraco,日志表每毫秒都会被多次调用锤击。
答案 0 :(得分:1)
我们已经确定了这个问题。它归结为过期文档以及umbraco 4.5.2如何处理它们。
在反汇编dll之后,我们在publishService类(umbraco.presentation)中找到了CheckPublishing方法的罪魁祸首:
foreach (Document d in Document.GetDocumentsForExpiration())
{
library.UnPublishSingleNode(d.Id);
}
GetDocumentsForExpiration()运行以下查询:
IRecordsReader dr = CMSNode.SqlHelper.ExecuteReader("select distinct nodeId from cmsDocument where newest = 1 and not expireDate is null and expireDate <= @today", new IParameter[] { CMSNode.SqlHelper.CreateParameter("@today", DateTime.Now) });
因此,umbraco运行此发布服务来检查和取消发布过期文档,而不实际更新过期日期,该日期用于获取需要过期/未发布的文档。因此,文件永远不会过期(虽然它们未发表)。
每次文档发生更改(发布,取消发布,保存等)时,都会对分布式服务器进行调用。由于publishService和上面列出的代码,每次运行服务时这些过期的文档都是未发布的,导致许多分布式调用(以及写入的数据库记录)。
解决方案是清除这些文档的过期日期(手动或通过SQL代理作业)或修复Umbraco源代码。
此错误已在Umbraco的更高版本中修复(不确定修复了哪个版本,但我检查了4.11.3并且它具有固定代码)。