整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

「译」一行 JavaScript 代码竟然让 FT.

「译」一行 JavaScript 代码竟然让 FT.com 网站慢了十倍

能退化的探索之旅

发现问题

这一切开始于一个警报,首页应用的错误率高于 4% 的阈值。

显示数千个错误页面对我们的用户产生了切实的影响(还好 CDN 缓存抵消一部分影响)。

被用户看到的错误页面

应用程序的错误日志显示,该应用程序没有任何有关 top stories 的数据。

诊断问题

首页的工作原理是在一个时间间隔内轮询 GraphQL api 以获取数据,将该数据存储在内存中并根据请求渲染它。从理论上讲,如果请求失败,应该保留之前稳定的数据。进一步深入日志,我们看到对 GraphQL api 的请求失败了,但是是有错误而不是超时——或者至少是不同类型的超时。

FetchError: response timeout at https://….&source=next-front-page over limit: 5000

奇怪的是,API 的响应时间似乎远低于首页设置的 5 秒超时。这让我们相信问题出现在首页和应用程序之间的连接上。我们做了些尝试——在两者之间使用 keepAlive 连接,分散请求,这样它们就不会同时发起。这些似乎都没有产生任何影响。

更神秘的是 Heroku 上显示的响应时间。第 95 百分位数约为 2-3 秒,而最大值有时达到 10-15 秒。由于首页被 Fastly 高度缓存,包括 stale-while-revalidate 头,许多用户可能不会注意到。但这很奇怪,因为首页真的不应该做很多工作来渲染页面。所有数据都保存在内存中。

首页的 Heroku 响应时间

因此我们决定对本地运行的应用程序副本进行一些分析。我们将通过使用 Apache Bench 每秒发出10个请求,共发出 1000 个请求来复制一些负载。

使用 node-clinic 和 nsolid,我们可以对内存、CPU 和应用程序代码有更深的理解。运行它们,确认我们可以在本地复现该问题。首页需要 200-300 s 才能完成测试,超过 800 个请求不成功。相比之下,在文章页面上运行相同的测试需要大约 50 秒。

测试用时:305.629 秒

完成的请求:1000

失败的请求:876

而且你看,n-solid 的图表显示事件循环的滞后超过 100 毫秒。

在做加载测试时事件循环滞后

使用 n-solid 的 CPU 分析器,我们可以精确定位阻塞事件循环的确切代码行。

火焰图显示导致滞后的函数

修复问题

罪魁祸首是...

return JSON.parse(JSON.stringify(this._data));

对于每个请求,我们使用 JSON.parse/stringify 来创建数据的深克隆。这种方法本身不坏 —— 可能是深克隆比较快方法之一。但它们是同步方法,因此在执行时会阻塞事件循环。

在我们的案例中,这个方法在每个页面渲染(对于每个被渲染的部分)中多次调用,具有大量数据(每次执行时整个页面所需的数据),并且我们有几个并发请求。由于 Javascript 是单线程的,因此这将对应用程序尝试执行的所有其他操作产生连锁反应。

深克隆数据的原因是,我们会根据请求中的一些信息(例如,是否启用了特定功能的切换),来改变对象。

为了解决这个问题——并减轻克隆所有内容的需要——我们在检索时对对象应用了深度冻结,然后在数据被改动的地方克隆特定位。这仍然执行同步克隆——但仅限于更小的数据子集。

结论

修复好后,我们重新运行了负载测试,并在很短的时间内完成,0 次错误。

测试用时:37.476 秒

完成的请求:1000

失败的请求:0

我们发布了修复程序,看到响应时间和错误()立即减少,并希望一些用户开心!

修复后首页的响应时间

关于未来

  • 对其他一些应用程序运行此分析,并了解我们可以进一步优化和/或减少 dyno 大小,这也会很有趣。
  • 我们可以让事件循环更可见吗?
  • 我们的首页应该是 stale-on-error——所以为什么仍然会看到数以千计的错误页面?这个数字好还是坏?

作者:IridescentMia

链接:https://juejin.im/post/5b7bb6dfe51d4538bf55aa5f

迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练、PDF电子文档、面试集锦、学习资料等。

用 Python 快速实现 HTTP 服务器

有时你需临时搭建一个简单的 Web Server,但你又不想去安装 Apache、Nginx 等这类功能较复杂的 HTTP 服务程序时。这时可以使用 Python 内建的 SimpleHTTPServer 模块快速搭建一个简单的 HTTP 服务器。

SimpleHTTPServer 模块可以把你指定目录中的文件和文件夹以一个简单的 Web 页面的方式展示出来。

假设我们需要以 Web 方式共享目录 /Users/Mike/Docker,只需要以下这个命令行就可以轻松实现:

$ cd /Users/Mike/Docker
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

SimpleHTTPServer 模块默认会在 8000 端口上监听一个 HTTP 服务,这时就可以打开浏览器输入 http://IP:Port 访问这个 Web 页面。例如类似下面的 URL:

http://192.168.100.49:8000

如果你需要 Web 服务有一个默认页,可以在目录下创建一个名为 index.html 的文件。如果没有默认页,那么会以列表的形式将目录中的内容显示出来。

如果默认的 8000 端口已经被占用,你想换成使用其它端口号,可以使用如下的命令:

$ python -m SimpleHTTPServer 8080

用 Python 快速实现 FTP 服务器

有时当你想快速搭建一个 FTP 服务器来临时实现文件上传下载时,这是特别有用的。我们这里利用 Python 的 Pyftpdlib 模块可以快速的实现一个 FTP 服务器的功能。

首先安装 Pyftpdlib 模块

$ sudo pip install pyftpdlib

通过 Python 的 -m 选项将 Pyftpdlib 模块作为一个简单的独立服务器来运行,假设我们需要共享目录 /Users/Mike/Docker,只需要以下这个命令行就可以轻松实现:

$ cd /Users/Mike/Docker
$ python -m pyftpdlib
[I 2018-01-02 16:24:02] >>> starting FTP server on :::2121, pid=7517 <<<
[I 2018-01-02 16:24:02] concurrency model: async
[I 2018-01-02 16:24:02] masquerade (NAT) address: None
[I 2018-01-02 16:24:02] passive ports: None

至此一个简单的 FTP 服务器已经搭建完成,访问 ftp://IP:PORT 即可。例如类似下面的 URL:

ftp://192.168.100.49:2121
  • 默认 IP 为本机所有可用 IP,端口为 2121。
  • 默认登陆方式为匿名。
  • 默认权限是只读。

如果你要建一个有认证且可写的 FTP 服务器,可使用类似以下指令:

$ python -m pyftpdlib -i 192.168.100.49 -w -d /tmp/ -u mike -P 123456
小插曲:测试时一直使用密码 000000 这样的弱密码做认证密码,在客户端登陆时一直提示认证失败。看来 Pyftpdlib 模块还做了基本的安全策略哟,不错的!

常用可选参数说明:

-i 指定IP地址(默认为本机所有可用 IP 地址)
-p 指定端口(默认为 2121)
-w 写权限(默认为只读)
-d 指定目录 (默认为当前目录)
-u 指定登录用户名
-P 指定登录密码

更多参数可以使用以下指令查询:

$ python -m pyftpdlib --help
Usage: python -m pyftpdlib [options]
Start a stand alone anonymous FTP server.
Options:
-h, --help
show this help message and exit
-i ADDRESS, --interface=ADDRESS
specify the interface to run on (default all interfaces)
-p PORT, --port=PORT
specify port number to run on (default 2121)
-w, --write
grants write access for logged in user (default read-only)
-d FOLDER, --directory=FOLDER
specify the directory to share (default current directory)
-n ADDRESS, --nat-address=ADDRESS
the NAT address to use for passive connections
-r FROM-TO, --range=FROM-TO
the range of TCP ports to use for passive connections (e.g. -r 8000-9000)
-D, --debug
enable DEBUG logging evel
-v, --version
print pyftpdlib version and exit
-V, --verbose
activate a more verbose logging
-u USERNAME, --username=USERNAME
specify username to login with (anonymous login will be disabled and password required if supplied)
-P PASSWORD, --password=PASSWORD
specify a password to login with (username required to be useful)

如果你需卸载 Pyftpdlib 模块,可以通过以下命令:

前话

Hello,小伙伴们大家新年好,本篇是今年第一篇,也筹划许久,本篇主题为美食,系html5网站模板,div加css布局,网页资源分开存储以便管理,网页结构清晰简单,希望本篇能够助力各位萌新

主题

《周末の食记》

美食能抚平一切的忧伤

简介

文件结构包含了css、fonts、images、js和html,运用html5技术,包括nav标签、header标签和footer标签等,采用bootstrap进行布局

图摘

目录

编码

<div class="ftco-46-row d-flex flex-column flex-lg-row">
    <div class="ftco-46-text ftco-46-arrow-right">
        <h4 class="ftco-46-subheading">Food</h4>
        <h3 class="ftco-46-heading">扬州炒饭</h3>
        <p class="mb-5">一碗不一样的炒饭,让你难以拒绝.</p>
        <p><a href="#" class="btn-link">更多 <span class="ion-android-arrow-forward"></span></a></p>
        </div>
        <div class="ftco-46-image" style="background-image: url(images/img_3.jpg);"></div>
        <div class="ftco-46-text ftco-46-arrow-up">
        <h4 class="ftco-46-subheading">Food</h4>
        <h3 class="ftco-46-heading">蓝莓酸奶冰激凌</h3>
        <p class="mb-5">触动您的心灵,令人甜蜜至极,难以忘怀,心旷神怡的味觉享受,精选一级的夏威夷果仁,入口丝滑</p>
        <p><a href="#" class="btn-link">更多 <span class="ion-android-arrow-forward"></span></a></p>
    </div>
</div>

结语

如果人的一生总的能量是固定的话,那就节省开支,延长时间,喜怒哀乐不溢于言表,不困于心智,保持乐观心态