uWSGI socket 队列被占满的问题

国庆之后第一天,同事在 uWSGI 的日志发现这样的东西:

真有意思,看日志的表面意思是 socket 的队列被占满了。

介绍一下我们的业务场景吧,这个 uWSGI 服务负责处理的 HTTP 请求大多数一个前端的应用发过来的,请求耗时会很长,最长可能到 2 分钟,最短 ms 级别。处理请求的耗时不稳定,请求的频率也不稳定,比如可能突然发过来很多耗时长的请求。

我们的 uWSGI 基本没有配置,大多都是默认的参数,所以出现这种日志几乎是必然的。在网上搜索了一下,看到几篇 CSDN “互相参考” 风格的解决方案:加大 socket queue 的 size。主要操作分成两步:

  1. 加大内核的 socket queue
  2. 加大 uWSGI 的 queue

uWSGI 有一个 stat server,因为我们使用的默认的参数,查看 uWSGI 的 stats 可以看到 socket 的队列最大为 100:

开始修改,首先使用 sysctl 加大 kernel 的 socket queue.  执行 sudo echo "net.core.somaxconn = 1024" >> /etc/sysctl.conf; sysctl -p。然后在 uWSGI 启动参数添加 listen = 2014

要注意的是,如果只修改了 uWSGI 的 listen 参数但是不修改系统参数,将会碰到下面这个错误。

修改之后可以重新看 stats 发现确实修改成了 1024:

看起来大功告成了,但是突然,我眉头一皱,发现事情并没有这么简单。如果 uWSGI 并发能力不够,那么加大队列并没有什么意义啊,早晚是会满的,无论改成多大,占满队列只是时间问题。所以同样的 warning 不加思索的照抄网上的方法是不可取的,要思考根本原因。根本原因就是有些请求处理时间太长了,而且都是 IO 耗时,这个时候最合理的方案是加大线程数量,增加并发能力。

uWSGI 默认是单进程单线程启动的,并发能力当然低了。一般来说进程数与 CPU 数相等。但是我们这个应用处理请求是高 IO 的,所以我每个进程又开了 32 个线程。在 uWSGI 中添加的配置如下:

 

推荐一个 debug 的工具,简直是神器:uwsgitop。uWSGI 自身提供一个 stats 服务器,可以是 socket 的,也可以是 http 的。这个工具可以自动帮你刷新 uWSGI 的实时状态,像 top 那样展示出来。关键是代码竟然只有 300 行左右,惊为天人。

uwsgitop 显示效果

 

推荐一个小众民谣乐队 Small Sur

Small Sur 的《Berlin》,第一次看见这首歌是一年之前了。看到这首歌的名字的时候刚回国,就被这个名字吸引了。第一次听被惊艳到了,歌曲听起来特别安静,像冬天的街头,你可以感受到清冷的空气,明亮的阳光。

这是一个三个人组成的美国民谣乐队。《Berlin》这首歌在网易云音乐的好评比较多,其余的歌都不怎么受关注。毕竟这个乐队一共也才出了三张专辑。

但是我最喜欢的是那首《Labor》,整首歌基本上没有重复的旋律,歌词也很美,像是配合着节奏在下定一个决心一下,很鼓舞人。

《Labor 歌词》

Oh,I swear I’ll find

even more light in this coming year.

And the darkness will subside

or bring focus unto the light.

I will build a shrine

and within

place my present mind.

Shaped from water,

auburn earth,

I will favor my lover over others.

I will be inspired

by my friends,

by all questions.

And in the meantime

I will work.

I will labor for my lover,

for my mother.

Small Sur 一共发布了三十几首歌,不算多,一点儿也不同质化,都很好听。心情不好的时候可以挨着听听,想想事情。

 

 

介绍一下 graphviz/dot 的一些学习资料

最近一直在用 dot 来画图,如果你不知道 dot 这个东西,那么 graphviz 应该听说过吧,graphviz 是 dot 语言的一个实现。dot 是一个绘图语言,可以表达有向图和无向图,用 dot 语言描述的图可以 render 成 png、jpeg、pdf、svg 等等各种格式,非常方便。

比如下面这个 dot 文件:

可以渲染成下面这个文件:

dot-example

 

Mac 的 graphviz 提供了命令行的工具可以渲染 dot 文件。可以通过 brew 来安装: brew install graphviz 。

但是每次编辑然后切换到命令行渲染,再用 Preview 打开浏览,非常繁琐,这种文件修修改改是比较频繁的,预览体验很不好,比较合适的方法是用 jupyter 这样的 notebook 来实时渲染。Graphviz 目前没有可以直接在 jupyter 里面跑的 kernel,不过 Python 的封装是支持在 jupyter 看到结果的。这个缺点是你要写 Python 语言,调用 Python 的函数和方法,show 函数等等。不能写原生的 dot 语言。

我在这上面包了一层,调用这个包可以直接在 jupyter 的 cell 里面写 dot 了,项目的地址如下:

https://github.com/laixintao/jupyter-dot-kernel

这个 kernel 其实挺好写的,去看了一下文档,基本复用一下 IPython 的 kernel 就可以了。但是发送二进制数据回前端的 Response 结构很妖娆,文档也看不怎么明白,网上的资料也比较少…… 算是一个小坑吧,在这上面花了不少时间。最后是一拍脑袋,去找了其他 kernel 的代码看了一下才弄清楚的。贴在下面让大家感受下……

 

然后我还在 jupyter 里面写了一个教程(WIP),目前写了基础的教程, 看完之后基本都知道怎么样了。后面打算继续完善一些一些更高级的用法。教程的地址如下:

https://github.com/laixintao/learn-dot

 

我参考的主要是一些手册和文档,其实目前找到的也不是很多。那个 dot 文档竟然没有一个目录,有必要整理一下。

  1. dot 文档:
    1. The DOT Language
    2. Command-line Usage
    3. Output Formats
    4. Graph Attributes 这个文档比较关键,列举了所有可以用的属性
    5. Node Shapes
    6. Colors
    7. Arrow Shapes
  2. graphviz manual: man dot
  3. dot guide 官方 PDF
 

婚姻的决定:Everything Forever or Nothing Ever Again

这篇文章是在 hackernews 上面看到的,最近好奇怪,V2EX 和 hackernews 都看到很多感情类的帖子。这篇文章还不错,特地部分翻译一下。以下为译文。原文地址


一段感情的开始,并没有标准的模式。有些人是开始一次约会,然后再一次约会,然后再约会,有一天双方都自然而然承认这是一段亲密的男女关系了;有些人虽然一直在约会,但是只是朋友关系,直到一次正式确立关系的谈话,才算开始关系;有些人是一直保持着柏拉图式的朋友关系,但是表面之下一直有某种感情的涌动,直到一个突发的吻将感情点燃。

但一般情况下,第一次都是这样的:

之后,你们便沉浸在甜蜜之中:

你们之间的新关系会24小时陪着你,即使彼此不在身边。

你们将生活中所有烦心的事抛在脑后,这样的感觉非常好。接着,这种事情便自然地发生了。

 

所有那些歌词你都感同身受了。

这样持续一段时间之后,你开始意识到一些变化。最初的独角兽变成了普通的马,又变成了自行车,最后什么都不剩了。你爱慕的那个完美的人,开始做不完美的事情。一开始你觉得对方一些小癖好很可爱,如今变得烦人。你开始意识到自己和一个很糟糕的人在一起。

事情变得越来越糟,蝴蝶和彩虹变成了破灭的幻想,曾经给你鼓舞的感情现在成了你的枷锁。

曾经的你被爱蒙蔽了双眼,看不见的阴暗面现在清楚的呈现在你眼前,重重地牵绊着你。

大部分的感情都到此为止了。

但是也有可能,看到你的伴侣的黑暗面,你可以后退一步,看一下好的地方和不好的地方。你可以摘下有色眼镜,看看和你在一起的这个人:这个三维的、独一无二的、漂亮的、笨拙的人。

他是最好的。

也是最差的。

是你的队友。

也是你的后盾。

于是你决定珍惜你现有的生活。

从此一起生活。

当生活终于要走上正轨的时候,又有别的事情出现了。

 

世界上大多数的社会,都不喜欢让一段感情持续很久。对社会来说,一段关系只是一个简单的测试场——一个决定的孵化器。如果一段关系持续了很长时间,依然没有重大的决定(是否结婚),从社会的角度讲,这就是不合理的。为了纠正这个“不合理”,社会将从各种角度对这段感情施加压力。

有些人比社会还要强大,但大多数人不是这样的。对于我们大多数人来说,社会的规则就是我们的规则,当你和你的伴侣在蓝色的平衡木走下去时,你会感觉到可以行走的空间越来越少了。你必须要做出决定了。

你要决定,让现在的生活成为你将来每一天的生活,或者放弃现在的所有。

大多数人并不具备做出决定的能力。我们的生命很短暂,做出60年的承诺并不是一件小事。我们在一个小环境中长大,并没有面对多少选择。大多数人在面临这个决定的时候,经验相对较少。对一个独立的、成年的自我的理解不完全,甚至很多人才刚刚有了自我的意识。

但是社会不管,你必须作出决定。

 

就翻译到这里吧,后文中讨论了一般人做出决定的方法,以及对结婚这个决定的建议。如果你读到这里依然感兴趣,就去阅读原文吧。感情是很复杂的,每一个人面临的决定都不同。

 

索尼 Digital Paper Dpt-rp1 阅读器使用体验

自从 Kindle 面世以来,我已经买过三个了,买来之后使用率很高,基本没有沦落到“盖泡面”的下场。但是一直以来都有一个痛点就是,阅读不能重排的 PDF 太痛苦了,只能通过缩放放大字体,而缩放之后移动又很慢,所以我基本上只在电脑上看这种 PDF。

其实 iPad 是个不错的选择(除了看 PDF,这玩意对我来说是在想不出有什么用处)。最近本来期待苹果的发布会能发售一款新的 iPad,如果好呢,我就买新的,如果不好,那么旧款肯定会降价,就买旧款。结果发布会结束也没有出现新的 iPad,大概是觉得 iPad 实在找不到什么新的亮点了吧。

和同事吃饭的时候,被提醒索尼还有一个电纸书阅读器呢,于是吃完饭回来看了看,呵,这么巧,正好是今年 6 月份登陆大陆国行了,在京东售价 5666 元。然后就下单了,虽然超出预算好多。(跟同事吃了一顿饭被安利这么贵的东西,不过第二天我反安利了他一台显示器,算是扯平了)

第二天送到了。拿到的感受:廉价感!包装就一盒子,打开就一摞纸的手感(背面貌似是牛皮纸?)但是好轻、好薄啊!

仅仅是普通的盒子而已,很轻很轻。

打开发现本体和盒子一样大

欢迎来到崭新的阅读世界

这也太薄了,怕不小心真和纸一样被撕烂

官方的保护套 600 元,而且是牛皮纸材质的。心里感觉不值。于是买了一个第三方的保护套,350 元。后来想想也挺贵的啊!不过对比 600 的竟然没感觉了,肉疼。这个保护套手感挺好的,不足之处是让这个电纸书的总重量足足多了一倍。安装方式是 3M 胶粘上的,官方的保护套也是这样的。也能接受吧,毕竟一般不会拆。

第三方皮革材质保护套

打开的样子

充电线和索尼 PS4 的充电线貌似是一样的。说明书说要使用官方的充电线传输和充电,防止磁干扰,为了保险,还是听他的吧。

Digital Paper App 全平台都有,手机也有 App,但是体验太差,貌似没什么用。拔下传输线无须弹出操作,只要不在传输状态直接拔掉就可以。

展示一下阅读效果。

一本 PDF

纪念 John McCarthy

放笔的地方,磁力+凹槽卡住来固定

和 A4 纸的对比

放大之后使用手写笔体验很不错

阅读论文的效果

看漫画的效果

使用一段时间来看,优点和缺点都和网上大家说的一样:

优点:

  1. 分辨率高 1650*2200像素
  2. 大。完美解决了我的痛点,虽然缩放之后移动还是很慢,但是 13.3 英寸,和我上一台 Mac Pro 一样大的屏幕,你还用的着缩放吗?看书的字一般都比同本实体书的大
  3. 轻。349g。
  4. 带书写,做笔记方便。

缺点:

  1. 贵。可以理解,买的人少,相当于研发的费用只好少数购买者均摊了。
  2. 没有背光。这其实是对我来说最痛的,经常要坐车,我现在用的 Kindle 就是不发光的,没有背光很不方便。不过这么大的屏幕,背光很难打均匀吧。
  3. 软件垃圾。非常垃圾,比如 PDF 竟然不支持目录,不支持跳转;Wi-Fi 蓝牙传输特别繁琐,我到现在也没搞明白怎么用;不支持其他格式;竟然有 NFC 解锁屏幕的功能,大哥这个有个毛用啊,正规的功能你不好好做好。我还是就简简单单的用电脑来传吧。
  4. 手写笔笔尖磨损严重,这是大家都提到的。购买的时候把这部分也要考虑到预算里面去。笔尖10支 268 元。

我买书是从不含糊的,我觉得书无论多贵,买来只要看完就是赚到了,无论多便宜,买来不看一样是浪费。这个阅读器确实是有点贵了,不过能让我读更多书的话,也是值得的。很多 pdf 只找的到不能重排的版本。

不过一个替代的方案可以是 1,淘宝待打印邮寄过来;2,买一台打印机,6000 块钱够十几年的阅读量了吧。

另一个有意思的点是,整个包装、说明书和机器都在宣传一种“无纸化办公”的概念。在日本打字比较繁琐,有时候手写比打字还快,所以在日本的办公文化中,这款产品可能会解决浪费纸张的问题。电纸书内也提供了手写笔记、日程的功能,甚至可以用来写手帐?

 

最后推荐一些资源:

  1. 电纸书官方说明书 PDF
  2. 一个每天发一本盗版书的网站(羞耻)
  3. 不通过 APP 向电纸书 WiFi 传文件的脚本(in Python)
  4. Automated download of Sony Digital Paper notes on Linux

 

相关阅读:

  1. DPT-RP1使用体验
  2. 开箱