我们有动态网页由 Firebase云功能提供,但TTFB
在TTFB为900ms - 2s
的这些网页上速度非常慢,起初我们只是假设它是一个cold start
问题,但即使流量一致,它在700ms - 1.2s
的TTFB也非常慢。
这对我们的项目来说有点问题,因为它依赖于自然流量,Google Pagespeed需要服务器响应小于200ms
。
无论如何,我们试图检查可能导致问题的原因,我们用Firestore查明了它,当Cloud Function访问Firestore时,我们注意到有一些延迟。这是我们如何实现Cloud Function和Firestore的基本示例代码:
dynamicPages.get('/ph/test/:id', (req, res) => {
var globalStartTime = Date.now();
var period = [];
db.collection("CollectionTest")
.get()
.then((querySnapshot) => {
period.push(Date.now() - globalStartTime);
console.log('1', period);
return db.collection("CollectionTest")
.get();
})
.then((querySnapshot) => {
period.push(Date.now() - globalStartTime);
console.log('2', period);
res.status(200)
.send('Period: ' + JSON.stringify(period));
return true;
})
.catch((error) => {
console.log(error);
res.end();
return false;
});
});
这是在 Firebase + Cloud Functions + NodeJS
上运行的CollectionTest 非常小,里面只有100个文档,每个文档都包含以下字段:
directorName: (string)
directorProfileUrl: (string)
duration: (string)
genre: (array)
posterUrl: (string)
rating: (string)
releaseDate: (string)
status: (int)
synopsis: (string)
title: (string)
trailerId: (string)
urlId: (string)
通过此测试,我们将得到以下结果:
[467,762] 1.52s
[203,315] 1.09s
[203,502] 1.15s
[191,297] 1.00s
[206,319] 1.03s
[161,267] 1.03s
[115,222] 843ms
[192,301] 940ms
[201,308] 945ms
[208,312] 950ms
此数据为[ Firestore Call 1 Exectution Time , Firestore Call 2 Exectution Time ] TTFB
如果我们检查测试结果,有迹象表明TTFB正在降低,也许是云功能已经预热了?但即便如此,基于我们第二次Firestore Call的结果,Firestore在Cloud Function中耗尽了200-300ms,即使Firestore执行的时间较短,TTFB仍然需要600-800ms,但这是另一回事。
无论如何,任何人都可以帮助我们如何在云功能(或者如果可能的话,TTFB性能)中提高Firestore性能吗?也许我们正在做一些我们不知道的明显错误的事情?
答案 0 :(得分:1)
我会尝试提供帮助,但在返回dynamicPages
之前可能缺少关于你加载的内容的一些背景信息,但这里有一些线索:
首先,显而易见的部分(我必须指出它):
1 - 注意如何衡量TTFB:
远程测量TTFB意味着您还在测量网络 同时延迟掩盖TTFB的事实 测量:Web服务器响应请求的速度。
2 - 来自Google Developers有关Understanding Resource Timing
(here)的文档:
[...]。之一:
Bad network conditions between client and server, or A slowly responding server application
要解决高TTFB问题,首先要尽量减少网络数量。 理想情况下,在本地托管应用程序,看看是否还有一个大的 TTFB。如果有,那么应用程序需要进行优化 响应速度。这可能意味着优化数据库查询, 为某些内容部分实现缓存或修改 您的Web服务器配置。后端可能有很多原因 慢。您需要对您的软件进行研究并弄清楚 什么不符合你的绩效预算。
如果TTFB本地较低,那么客户端和网络之间的网络 服务器是问题。网络遍历可能受到阻碍 任何数量的东西。客户和客户之间有很多要点 服务器和每个服务器都有自己的连接限制 导致问题。测试减少这种情况的最简单方法是放置 您在另一台主机上的申请,看看TTFB是否有所改善。
不那么明显:
您可以在此处查看有关Cloud Functions Performance
的官方Google文档:https://cloud.google.com/functions/docs/bestpractices/tips
您之前需要一些文件吗?
根据Firebase cloud functions is very slow
的回答:Firebase cloud functions is very slow:
看起来很多这些问题都可以通过隐藏来解决 变量process.env.FUNCTION_NAME如下所示: https://github.com/firebase/functions-samples/issues/170#issuecomment-323375462
加载这些动态网页是由guest
用户还是logged
用户访问的?因为第一个请求可能需要对身份验证详细信息进行排序,因此已知它更慢......
如果没有这方面的工作,我将看一下常见的性能问题,如数据库连接(here:Optimize Database Performance
),改进服务器配置,缓存所有内容并处理可能的重定向在你的应用程序......
要结束,通过Internet阅读,您的问题有很多线程(简单云功能的性能低下)。像这样:https://github.com/GoogleCloudPlatform/google-cloud-node/issues/2374&&在S.O:https://stackoverflow.com/search?q=%5Bgoogle-cloud-functions%5D+slow
评论如下:
因为在使用云功能时,会对每个http产生惩罚 调用开销仍然非常高(即每个HTTP调用0.8秒)。
或:
请记住,Cloud Functions和Cloud Firestore都在 测试版并不保证性能。我相信你 比较性能与实时数据库,你会看到更好 号。
也许这仍然是一个问题。
希望它有所帮助!