FPs

Ngxfmt

接手一坨缩进、格式乱七八糟的Nginx 配置,简直要命。想起golang 有一个gofmt,动手做一个简单的ngxfmt。

Continue ->

抓取微博,同步到Twitter

zelda

前几个月买了NintendoSwitch,沉迷于“塞尔达-荒野之息”不能自拔,同时也关注着NS 新游戏的资讯。 微博上有几个帐号会发布各种NS 游戏信息,不过微博做的和💩 一样,完全不想用。联系了那几个微博博主,询问是否考虑也同步发在Twitter,没理我,那就自己动手吧。

Continue ->

ioping

ioping

发现一个有趣的工具 - ioping,类似常用的ping 命令。ping 用来ping 网络,看延时、丢包等等,ioping 用来 “ping” IO,看IO 耗时,读写速度等等。

ioping

simple disk I/0 latency measuring tool

用常见的包管理工具就可以安装上,

apt/yum/dnf/brew install ioping

ping 命令基本无害,不过ioping 据说可能会损坏数据,得小心使用。

安装之后,man 一下查看手册,会发现选项还挺多:每一次写入的大小,写入/读取请求的间隔,请求的总次数,同步/异步 IO, direct I/O 、cached I/O 多种模式等等。

默认一个数据块是4k ,可以选择写入,读取,或者读写交替模式,以前简单的IO测试都是用dd,以后可以试一试用ioping,当然,专业严谨的压测还是得用fio

具体语法和示例,可以参考以下资料:


禁用透明大页

tl;dr(长话短说)

“透明大页(Transparent Hugepages)”是一个Linux 内核特性,它通过提高处理器的内存映射硬件的使用效率(译注:降低TLB Miss 和page fault,提高TLB 的命中率,这部分基础知识可以翻下操作系统书)来获取更好的性能。在绝大多数Linux 发行版中它是被默认启用的(“enabled=always”)。

透明大页能让一些应用程序的性能提高一点点(最好的情况大约是10%,一般在0~3%),但是它会造成很明显的性能问题(参考:1.mongodb,2.oracle, 3.splunk), 甚至会造成严重的内存泄漏(参考:1.digitalocean,2.golang/go).

为了避免这些问题,你应该将运行的服务器设置成enabled=madvise

echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled

并在服务器的内核命令行上设置transparent_hugepage=madvise(例如在/etc/default/grub 中设置)。

这样修改之后,应用程序能通过透明大页提升性能,也能避免上述问题(译注:设置成madvise,应用程序通过设置MADV_HUGEPAGE标志就能分配到大页,不需要的程序则不受影响)。

继续阅读了解更多细节。

Continue ->

Chrome,ERR_SPDY_PROTOCOL_ERROR 和无效的HTTP header

当你把网站迁移到性能更好的HTTP/2 协议时,可能会出现Chrome 没法加载页面的问题,取而代之是一个显示This site can’t be reached,以及错误信息为ERR_SPDY_PROTOCOL_ERROR 的页面。错误信息里面没有提到HTTP/2, 可能是因为 HTTP/2 是从SPDY 协议发展而来,所以错误信息还是老的SPDY。

chrome_err_spdy_protocol_error

出现ERR_SPDY_PROTOCOL_ERROR 可能是因为服务器发送了一个无效的HTTP header。Chrome 处理二进制的HTTP/2 协议时有一些严格,不会处理以空格代替破折号的header(例如用Referrer Policy 代替Referrer-Policy),也不会处理带着2个冒号的header(例如Content-Security-Policy:: ...),所以检查下你的header 是否准确。Firefox 会忽略这些无效的header,正常显示页面。

给出一个如何找到这些有问题的header 的方法。访问chrome://net-internals/#events(这链接没法点击,只能复制然后粘贴到地址栏再访问),在搜索框输入你的域名(我以example.com为例),然后在其他标签中打开出问题的网站。返回chrome://net-internals/#events ,选中Source Type 是HTTP2_SESSION 的行。

chrome-events-http2_session

在右边,可以看到HTTP/2 协议的详细信息,重点部分如下:

t=50413 [st=7]  HTTP2_SESSION_RECV_INVALID_HEADER
                --> header_name = "referrer policy"
                --> header_value = "same-origin"
t=50413 [st=7]  HTTP2_SESSION_SEND_RST_STREAM
               --> description = "Could not parse Spdy Control Frame Header."
               --> error_code = "1 (PROTOCOL_ERROR)"
               --> stream_id = 3

看到HTTP2_SESSION_RECV_INVALID_HEADER 那行了吗?无效的header 就在它下面,在这个问题中,无效的header 是referrer policy,用空格代替了破折号。HTTP/2 协议理的header 名称必须全小写,如果你发送一个Referrer-Policy的header,浏览器会视为referrer-policy。在这个问题中,被视为成无效的referrer policy

在你浏览器的chrome://net-internals/中,你能发现很多有趣的东西。这里有一些不会出现在开发者工具中的请求,例如浏览器扩展发出的请求。去试一试,说不定下次你debug 时能帮上忙。我在研究Opera browser “VPN” “VPN” in UR browser 就用过它。