数千个HTTP请求之后,ColdFusion服务器崩溃

我们正在Windows Server 2003 VPS上运行ColdFusion 8,其API通过连接器将学生logging公开给合作伙伴API。 我们的API返回大约5万个以XML格式序列化的学生logging,非常无缝。 当我们testing我们的连接器到我们的合作伙伴API时,我发现了一些非常可怕的事情。 我们的整个网站和网页主机都closures了。 我们假设我们的主机只是有一些问题,4小时后,没有解决scheme,没有回应他们的客户服务,我们终于得到了他们的答复,声称他们有一个“未经授权的用户”在他们的networking。 我们的服务器恢复后,我们无法连接到我们的网站,就好像Web服务或Coldfusion本身已经冻结。 这真的是我担心我们担心我们可能超负荷Web服务的地方。

正如我之前提到的,我们尝试将超过5万个HTTP POST请求发送给我们的合作伙伴的API,但是大约在1.6k之后停止

这是不好的做法还是有某种限速我可以放松在服务器configuration的某处? 我们设法find了解决办法,但它绕过了我们的连接器,这对我们的devise至关重要。

这是一次性交易,因为这么多请求的目的是用当前的数据填充我们的合作伙伴的网站,然后小时同步将请求降低到每小时100左右。

UPDATE

我们的合作伙伴API由Pardot拥有和运营。 我们正在通过将学生数据传递给他们的API将学生转化为潜在客户,不幸的是,似乎每次只能接受一名学生。 为此,我们必须单独完成所有5万个请求。

我们的服务器有4GB内存,运行Windows Server 2003 SP2的Intel Core 2 Duo @ 2.8GHz。

我在100名学生同步,400名学生同步以及1.4k名学生同步期间监控了服务器,结果如下:

100名学生 – 2.25GB的内存,30-40%的CPU利用率,0.2-0.3%的networking带宽

400名学生 – 2.30GB的内存,30-50%的CPU利用率,0.2-1.0%的networking带宽

1.4K学生 – 2.30GB的内存,30-70%的CPU利用率,0.2-1.0%的networking带宽

我知道这与5万名学生相差甚远,但我不想再冒险放弃我们的CMS系统。

为了让你看看我们的代码:

<cfif (#getStudents.statusCode# eq "200 OK")> <cftry> <cfloop index="StudentXML" array="#XmlSearch(responseSTUD,'/students/student')#"> <cfset StudentXML = XmlParse(StudentXML)> <cfhttp url="#PARDOT_CMS_UPSERT#" method="post" timeout="10000" > <cfhttpparam type="url" name="user_key" value="#PARDOT_CMS_USERKEY#"> <cfhttpparam type="url" name="api_key" value="#api_key#"> <cfhttpparam type="url" name="email" value="#StudentXML.student.email.XmlText#"> <cfhttpparam type="url" name="first_name" value="#StudentXML.student.first.XmlText#"> <cfhttpparam type="url" name="last_name" value="#StudentXML.student.last.XmlText#"> <cfhttpparam type="url" name="in_cms" value="#StudentXML.student.studentid.XmlText#"> <cfhttpparam type="url" name="company" value="#StudentXML.student.agencyname.XmlText#"> <cfhttpparam type="url" name="country" value="#StudentXML.student.countryname.XmlText#"> <cfhttpparam type="url" name="address_one" value="#StudentXML.student.address.XmlText#"> <cfhttpparam type="url" name="address_two" value="#StudentXML.student.address2.XmlText#"> <cfhttpparam type="url" name="city" value="#StudentXML.student.city.XmlText#"> <cfhttpparam type="url" name="state" value="#StudentXML.student.state_province.XmlText#"> <cfhttpparam type="url" name="zip" value="#StudentXML.student.postalcode.XmlText#"> <cfhttpparam type="url" name="phone" value="#StudentXML.student.phone.XmlText#"> <cfhttpparam type="url" name="fax" value="#StudentXML.student.fax.XmlText#"> <cfhttpparam type="url" name="output" value="simple"> </cfhttp> </cfloop> <cfcatch type="any"> <cfdump var="#cfcatch.Message#"> </cfcatch> </cftry> </cfif> 

更新2

我检查了CF日志,发现了其中的一些:

 "Error","jrpp-8","06/06/13","16:10:18","CMS-API","Java heap space The specific sequence of files included or processed is: D:\Clients\www.xxx.com\www\dev.cms\api\v1\api.cfm, line: 675 " java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2882) at java.io.CharArrayWriter.write(CharArrayWriter.java:105) at coldfusion.runtime.CharBuffer.replace(CharBuffer.java:37) at coldfusion.runtime.CharBuffer.replace(CharBuffer.java:50) at coldfusion.runtime.NeoBodyContent.write(NeoBodyContent.java:254) at cfapi2ecfm292155732._factor30(D:\Clients\www.xxx.com\www\dev.cms\api\v1\api.cfm:675) at cfapi2ecfm292155732._factor31(D:\Clients\www.xxx.com\www\dev.cms\api\v1\api.cfm:662) at cfapi2ecfm292155732._factor36(D:\Clients\www.xxx.com\www\dev.cms\api\v1\api.cfm:659) at cfapi2ecfm292155732._factor42(D:\Clients\www.xxx.com\www\dev.cms\api\v1\api.cfm:657) at cfapi2ecfm292155732._factor37(D:\Clients\www.xxx.com\www\dev.cms\api\v1\api.cfm) at cfapi2ecfm292155732._factor44(D:\Clients\www.xxx.com\www\dev.cms\api\v1\api.cfm:456) at cfapi2ecfm292155732._factor38(D:\Clients\www.xxx.com\www\dev.cms\api\v1\api.cfm) at cfapi2ecfm292155732._factor46(D:\Clients\www.xxx.com\www\dev.cms\api\v1\api.cfm:455) at cfapi2ecfm292155732._factor39(D:\Clients\www.xxx.com\www\dev.cms\api\v1\api.cfm) at cfapi2ecfm292155732._factor47(D:\Clients\www.xxx.com\www\dev.cms\api\v1\api.cfm:453) at cfapi2ecfm292155732.runPage(D:\Clients\www.xxx.com\www\dev.cms\api\v1\api.cfm:1) at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:192) at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:366) at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65) at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:279) at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48) at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40) at coldfusion.filter.PathFilter.invoke(PathFilter.java:86) at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70) at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28) at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38) at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46) at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38) at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22) at coldfusion.CfmServlet.service(CfmServlet.java:175) at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89) at jrun.servlet.FilterChain.doFilter(FilterChain.java:86) 

看起来我可能已经崩溃了CF中的JVM,有没有更好的方法来做到这一点? 我们正在考虑将所有logging最初导出为CSV文件并将其导入到Pardot中,因为我们再也不需要这么做了。

您是否监视了服务器上的CPU,磁盘和带宽使用情况? 我要做的第一件事是确保这些资源没有被超载。 Perfmon是一个明显的地方开始和检查你的CF日志。

您是否一个接一个地发出50K个发布请求(即单独的请求),还是这个XML文件中的50K个logging的单个请求? 如果前者那么你为什么要提出5万个请求呢? 可以通过一次请求所有50Klogging来完成,因为这只是一个请求和一个文件传输? 如果50K请求是顺序的(即下一个请求不是直到当前的请求完成),那么这似乎是一个温和的方式提出大量的请求。

我发现几乎绕过这个问题的解决scheme更符合“最佳实践”

我决定走出口数据的CSV文件的路线,因为这个问题源于试图最初填充数据库。 CSV导入工作完美,后续同步只发出约0-1000个请求,进一步优化和调度,我已经要求每30分钟0-50,这是理想的。