FPs

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 就用过它。


写一个Terraform Provider

上个月想给腾讯云写一个terraform provider,花了一周的时间入门Golang,参考现有的一些项目完成了CLBCRUD。本来想做成和阿里云的provider 一样完善,但是腾讯云的API 错误百出,有些产品的API 返回参数不一致。算了,等以后遇到具体需求再继续做。把学习写provider 的过程简单记录一下。

Continue ->

基于OpenResty 的whoami.akaimai.net 实现

上次收集整理Local DNS 地址 的时候看到akamai 的whoami.akamai.net,想起之前看到agentzh 基于OpenResty实现了一个权威DNS 服务器,感觉可以用openresty 简单快速的实现。

找到agentzh 当时的 gist,第一次学习OpenResty ,决定照猫画虎。看起来要在OpenResty 里面接受dns 数据包,并且返回,需要用到stream-lua-nginx-module这个模块,这里要注意的时候,截至目前(2017-08-30) master 分支还不支持 ngx.req.udp_socket ,agentzh 当时hack 的代码都在 bloody-dns-server 分支下面。

Continue ->

好吃的白萝卜

p45013249

朗科食堂提供一款小菜,腌制的白萝卜,酸甜可口,带着生姜的辛味,让我欲罢不能。

考虑到未来可能离职,鼓起勇气向食堂阿姨讨来了做法:

把萝卜切丁(或者切片),撒点盐腌制一上午,然后用清水冲洗、滤干,选择合适大小的容器装好,放姜片、白醋、泡椒水、白糖(或冰糖),放置于冰箱密封好保存2天

调料可以根据个人口味放

可以先少量做一下,试试口味


獲取Local DNS 地址信息

在網頁中獲取local dns 不太方便,看看大家是怎麼做的。

阿里雲CDN 診斷工具

阿里雲CDN提供的阿里昆仑用户诊断工具
alicdn_local_dns

獲取到local dns 的這個請求:

https://123-66-35-57-122894414.dns-detect.alicdn.com/api/cdnDetectHttps?method=commitDetectHttps&detectId=122894414&cb=jQuery110102821084573750223_1503489263656&_=1503489263658

一個奇怪的域名,每次訪問都不一樣:
123-66-35-57-122894414.dns-detect.alicdn.com
設備ID :
detectId=122894414

用戶訪問一個域名,瀏覽器給按照分配的local dns 發起dns 迭代查詢,最後向域名的權威服務器名查詢,最後這一步的時候可以得到local dns 的地址。

Continue ->

給Pelican 添加Twitter Card

之前發Tweet 的時候,發現有些鏈接能夠被識別出內容,帶着一個“卡片”。

例如:

twitter_card_demo

twitter_card_demo_2

一開始以爲是Twitter 對某些網站的特殊照顧,最近喵了下某個網址的源碼,才明白是需要自己設置的。

twitter_card_meta

  • twitter:card 是類型,常見的有summary 和summary_large_image
  • twitter:site 是網站的twitter 帳號
  • twitter:title 卡片顯示的標題
  • twitter:description 卡片顯示的內容概述
  • twitter:images 卡片中的圖片

細節可以參考:Twitter Developer Documentation

對於我的個人博客來說,summary 類似的卡片就夠用了,給每篇文章找個配圖也挺累的。

博客是用Pelican 生成的,找了一下插件,果然有一個,我fork 了下,修了一個bug :twitter_card

按照插件的說明搞完之後,測試一下,可以用這個工具:Card validator

twitter_card_validator

搞定,然而並沒有什麼卵用。