• 服务器性能讨论... at 2013年05月27日

    #11 楼 @bhuztez 哦,你可以试试 java 的 hello world, 这么多内存不用好浪费啊...

  • 服务器性能讨论... at 2013年05月27日

    #9 楼 @bhuztez 内存还这么多,不用白不用,没必要着急回收白白浪费时间吧... 我还想 GC.stop 然后 n 个请求后直接杀进程呢...

  • 服务器性能讨论... at 2013年05月27日

    #6 楼 @bhuztez 那是几万个请求后的... 打开 7M 左右

  • 服务器性能讨论... at 2013年05月27日

    ... 随便写了点东西,主要集中在 hello world... 意犹未尽是因为展开就是各种大坑啊...

    #3 楼 @goinaction aio 和 epoll 不是一回事,aio 是通过 callback 的方式做 read / write, 要用新开线程的,好处是对应函数在 posix 标准里。epoll 和 kqueue 是不开新线程,就没有 aio 复制栈/同步/切换 CPU 的开销。

    我们知道 unix 的一大特色就是什么都是文件,文件描述符 (fd) 可以用一个整数来表示打开的文件,socket, 管道等等东西。进程中的文件描述符 fork 以后还能用,例如 working with unix process 里有用 ruby 启动 python 进程然后在 python 中用 ruby 打开的 fd 的例子。

    block 的意思是在等待 read / write / accept 这些 io 操作的时候,进程是 sleep 的。如果用 nonblock 的文件描述符:fcntl(sock, F_SETFL, O_NONBLOCK), 你就可以:A. 写个无限循环去不断的问"是不是好了", 这样就会把 CPU 吃到 100% 还不如用 block 操作,B. 做别的事情,但可以做什么就需要一个调度机制,现在可以选择的有线程调度或者事件队列调度,线程调度就是 aio, 事件队列调度就是 epoll / kqueue.

    附带说一下 ruby 的 io 的神奇的地方:ruby 的 io 正常来说是阻塞整个进程的,但一开新线程,它就自动变成非阻塞了...

    #4 楼 @krazy 没用过,看它的实现应该是 libev 的包装?现在的事件框架太多了吧 libev, libevent, gevent, libuv ...

  • #45 楼 @bhuztez 好吧我记错了...

  • #43 楼 @bhuztez

    所以有服务器设计成主进程 accept 然后通过 pipe 分派给子进程的,但这样代码就变得比较复杂并且多产生很多 fd 了。就像你之前说的,如果 unix 能暴露一个进程间共享 fd 的 api 就完美了...

    p.s. 我修改补充了下 thundering herd 的链接...

  • #40 楼 @bhuztez 进程开太多也可能导致请求被扔掉的... 好多个在 accept 状态的进程被同时唤醒就会产生 thundering herd 效应,然后服务器一卡队列就又堆起来了... 另外每个进程都有数据库连接,拼命开直接就把数据库打爆了...

  • #37 楼 @bhuztez 这个很难说的,像秒杀之类的应用某个时刻就有巨大的峰值,其它时候就没什么压力

    另外我是试图用 listen(backlog) 解释本机测试为什么有 fail ...

  • #35 楼 @bhuztez fcgi prefork 100 个,100 个都在处理中了还是会暂时无人 accept, 扔掉请求。或者你的意思是 apache 的默认 listen() 值比较大?还是说可以动态增加 worker?

  • #33 楼 @bhuztez 队列大点对真实服务器作用就是应付突发的 pike, 子进程的线程池都满了就停止 accept 了

  • RSA 公钥加密问题 at 2013年05月27日

    pkcs1padding 应该是默认不用设置的,是公是母和 ecb 之类的 block chaining 一般写在 key file 里面了不用自己指定一遍吧?

    key = OpenSSL::PKey::RSA.read File.open 'xxx.key'
    data = [hex_data].pack 'H*'
    key.public_encrypt data
    
  • ruby + arduino + 乐高... http://rubysource.com/ruby-arduino-lego-rubot/

    当然单片机上的 AI 和 PC 不能比...

  • #23 楼 @vincent 另外一个原因可能是系统限制了 fd (文件描述符) 的最大数,每个请求都会在服务器端和请求端各产生一个新的 fd (某些把请求传递到子进程的构架会多一个 pipe fd), 你还可以 ulimit -n unlimited 一下...

  • #23 楼 @vincent 失败可能是这样的:

    rainbows 应该是用了 kgio 的 TCPServer, kgio 的继承了标准库的 TCPServer, 标准库的 TCPServer 调用了系统函数 listen, 然后 listen 有个 backlog 参数,就是系统维护的请求队列的大小,这个队列如果满了,其他请求就会扔掉,标准库用了个默认的 backlog 是 Socket::SOMAXCONN 往往比较小 (我的机器上是 128).

    TCPServer 的连接数限制可以用 TCPServer#listen(new_max_conn) 解决掉,但好像 rainbows / unicorn 本身也有一个最大连接数的限制不知道怎么改...

  • #3 楼 @xautjzd gets 是读一行,用 DATA.read 就读完了

    1. 两个下划线:__END__
    2. 只对启动脚本有效果,如果写在 a.rb 然后用 b.rb 载入 a.rb, 就没用
    3. 在 irb 没效果
  • BEGIN 与 END 问题 at 2013年05月26日

    简单易用的 ruby 语法参考: http://ruby.on-page.net/

  • BEGIN 与 END 问题 at 2013年05月26日

    #3 楼 @iBachue 在多行模式下面 at_exit {} 就会把同一个 hook 注册 n 遍了

    #2 楼 @xautjzd 那个解释本身就不通顺,字都写错了,不管它...

  • BEGIN 与 END 问题 at 2013年05月26日

    写过 awk 或者 perl 就明白了。

    主要在 ruby -n 时有用

    ruby -ne 'BEGIN{ i = 0 }; i += 1; END{ puts i }' < file_you_need_count_lines
    
  • 没办法吧,名词没有对应的翻译必须混搭,放代码必须混搭...

  • 把字符串写入文件保留'\n' at 2013年05月25日

    最明显可以看出区别的就是 '&'.to_json'&'.inspect , "&" 在 json 里是要转义的但在 ruby 不用

  • 把字符串写入文件保留'\n' at 2013年05月25日

    #11 楼 @toctan 因为 inspect 的结果是 ruby 字符串,to_json 的结果是 json 字符串,两种格式略有区别的。你要在 javascript 里用就 to_json 好了

  • 把字符串写入文件保留'\n' at 2013年05月25日

    #8 楼 @toctan 那用 str.to_json 就好了

  • 把字符串写入文件保留'\n' at 2013年05月25日

    #6 楼

    File.open('test', 'w') do |f|
      f.write(str.inspect[1...-1])
    end
    
  • 用 gif 做远程桌面展示... at 2013年05月25日

    #3 楼 @fredwu 贵厂威武...

  • gem 可以覆盖 stdlib 有什么可痛的,如果不带 stdlib 在一些不能装 gem 的地方就不好使了

  • #32 楼 @hooopo 嗯... 出错是个问题,pipe 的话也还要在 popen 后加上 $? 的判断...