V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
90safe
V2EX  ›  程序员

为什么会 wanmp 比 lnmp 慢了十倍呢?

  •  
  •   90safe · 2018-01-20 14:50:47 +08:00 · 8189 次点击
    这是一个创建于 2506 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以前做项目习惯用 lnmp,前些天老板说要 win 系统才行,那我就用了 wamp。结果刚刚老板问我,为什么那么卡?我就比对了下速度。

    两边机器配置完全一样,只是环境不同,一个是 lnmp,一个是 wnmp

    先是 wamp,响应速度 1300ms,我就改成 nginx,响应速度变成 1200ms。

    接着 lnmp,响应速度 120ms。

    请问这是啥情况?有什么办法查看具体卡在哪个环节吗?是 nginx、还是 mysql、还是 php-fpm ?

    58 条回复    2018-01-22 13:38:43 +08:00
    likuku
        1
    likuku  
       2018-01-20 14:54:34 +08:00
    Win 为何不用 IIS
    likuku
        2
    likuku  
       2018-01-20 14:57:52 +08:00   ❤️ 4
    "至于 Win 下 Nginx 使用原生 Win32 API,用 select 实现,而 Win 下比较先进的技术 I/O Completion Ports 据我所知有第三方做过,但官方 Nginx 貌似还没有用 IOCP,所以性能肯定没有 Linux 的 epoll 和 BSD 的 kqueue 好。"

    作者:残风
    链接: https://www.zhihu.com/question/53372247/answer/134816348
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    90safe
        3
    90safe  
    OP
       2018-01-20 14:59:06 +08:00
    @likuku IIS 用得少,不太习惯。刚刚试了下不读取数据库,打开 phpmyadmin 页面,linux 是 100ms,win 是 400ms。这样都有四倍的差距。
    zjsxwc
        4
    zjsxwc  
       2018-01-20 14:59:27 +08:00
    win 的进程开销比 Linux 的进程开销大很多吧
    abcbuzhiming
        5
    abcbuzhiming  
       2018-01-20 15:00:56 +08:00
    linux 下的网络模型是 epoll,apache 和 nginx 的最新版本都支持这个,windows 下的网络模型是 IOCP (完成端口),据我所知,apache 和 nginx 的普通版本不支持 IOCP 模型,nginx 似乎有个非官方的版本支持 IOCP,因此他们的性能一定会比在 linux 下的慢
    另外还有一个原因,在 linux 下的 php-fpm 是常驻进程的,而在 windows 下的 php 只能用 fastcgi,既不是常驻进程,性能也远低于 php-fpm。所以就算你把 Http 服务器换成 IIS,你的性能依然不会高到哪里去的
    endlessing
        6
    endlessing  
       2018-01-20 15:07:41 +08:00
    莫不是连了 MySQL ?
    90safe
        7
    90safe  
    OP
       2018-01-20 15:07:58 +08:00
    @abcbuzhiming 还有一个就是,我刚刚试了下 phpmyadmin 的登录时间,linux 是 300ms,win 是 1600ms,这差距。。。。登录操作 = 连接读取数据库,也就是说在 mysql 的环节也慢。。。
    cy97cool
        8
    cy97cool  
       2018-01-20 15:10:37 +08:00
    Windows 服务器用 Nginx+PHP 有 xxfpm,可以让 PHP 常驻内存
    chenqh
        9
    chenqh  
       2018-01-20 15:11:07 +08:00
    不应该啊,如果这么慢,php 在 windows 怎么有人用?
    wkan
        10
    wkan  
       2018-01-20 15:12:40 +08:00 via iPhone
    你要不要检查下 opcache 开没开
    est
        11
    est  
       2018-01-20 15:14:14 +08:00 via Android
    iis 快不仅是因为它用了 iocp,而是因为别人 http 处理逻辑是在内核实现的 http.sys 。性能比 linux 老内核高 50%没问题。只有 khttp 能一战

    不过然并卵,dpdk 发来贺电。
    jasontse
        12
    jasontse  
       2018-01-20 15:14:22 +08:00 via iPad   ❤️ 1
    @abcbuzhiming 错很大。fpm 全称 FastCGI Process Manager,两种系统毫无疑问都是 FastCGI,执行后就销毁进程的叫 CGI。

    Linux 和 Windows 确实存在性能差距,但是楼主的问题主要是调参,就这样回答楼主的问题无异于闭着眼睛开药。
    kokutou
        13
    kokutou  
       2018-01-20 15:17:23 +08:00
    @chenqh #9 因为简单。。。
    90safe
        14
    90safe  
    OP
       2018-01-20 15:21:43 +08:00
    @wkan win 跟 linux 都没开的
    tomczhen
        15
    tomczhen  
       2018-01-20 15:29:02 +08:00
    其实楼主只是想找论据支持自己说服老板不要用 Windows Server 而已,你们都这样客观的分析问题就违背楼主初衷了,直接说 Windows Server 就是这样垃圾,一样的程序比 Linux 慢十几倍就 O 了。
    90safe
        16
    90safe  
    OP
       2018-01-20 15:31:11 +08:00   ❤️ 1
    大家好,我回来了,我把数据库连接从 localhost 改成 127.0.0.1,速度从 1300ms 提升到了 300ms,现在差距缩小剩 3 倍了。
    liuxu
        17
    liuxu  
       2018-01-20 15:33:26 +08:00
    看看静态页访问速度怎样,如果静态也也慢就是 nginx 和 win 的问题,如果只是 php 慢,就用 xhprof 分析一下 php 这边哪部耗时了
    90safe
        18
    90safe  
    OP
       2018-01-20 15:36:47 +08:00
    虽然速度提升了不少,但是还是慢,还有办法优化吗? localhost 是因为 php-fpm 会检测是 ipv4 还是 ipv6,导致变慢,直接指定 127.0.0.1 就跳过检测了。现在差距还有 3-4 倍,急,在线等!
    likuku
        19
    likuku  
       2018-01-20 15:38:32 +08:00
    @chenqh 因为“自认会用 win ”的人远远多于摸过 Linux 的人。
    90safe
        20
    90safe  
    OP
       2018-01-20 15:39:39 +08:00
    @liuxu 用 phpmyadmin 的首页来测试,是没有涉及数据库操作,只有 nginx+php-fpm,速度是相差很小的的,大概 30ms 而已。但是如果登录连接数据库的话,速度就慢了很多很多。如果是 mysql 的问题,能怎么优化呢?
    likuku
        21
    likuku  
       2018-01-20 15:41:19 +08:00
    @90safe 中间件,mysql 连接池
    tomczhen
        22
    tomczhen  
       2018-01-20 15:42:30 +08:00 via Android
    @90safe 我猜你安装 MySQL for win 的时候选择了默认的开发环境配置参数了吧
    likuku
        23
    likuku  
       2018-01-20 15:43:27 +08:00
    读多写少,那么可以上 memcache
    ivmm
        24
    ivmm  
       2018-01-20 15:44:30 +08:00
    建议你买个 Plesk 面板 Windows 版 或者 Win 上 Docker LNMP

    傻逼老板给你的任务,你能被傻逼老板带节奏嘛,不行的呀
    ivmm
        25
    ivmm  
       2018-01-20 15:44:56 +08:00
    @ivmm Plesk 一年也就 700 多,比你花时间费心思有效率的多
    abcbuzhiming
        26
    abcbuzhiming  
       2018-01-20 15:45:24 +08:00
    @jasontse 你自己到底用 IIS 下的 PHP 没有? IIS 下自带的 fastcgi 就是不能常驻进程的,必须用另外一个楼提到的 xxfpm,而 linux 下的 php-fpm 默认就是常驻进程。我用过我才说这个话
    xutonglei86
        27
    xutonglei86  
       2018-01-20 15:55:14 +08:00
    数据库连接地址改成 127.0.0.1,win 系统下,如果数据库连接地址设置为 localhost 的话,会优先寻址 ipv6。ipv6 连接不上才会寻址 ipv4,所以延迟比较高,改成 ipv4 地址即可。。
    ivmm
        28
    ivmm  
       2018-01-20 15:58:37 +08:00
    @xutonglei86 还有这层说法,学到了
    ivmm
        29
    ivmm  
       2018-01-20 15:58:58 +08:00
    @xutonglei86 不过貌似一般都是在 hosts 文件里写一段 127.0.0.1 localhost
    Admstor
        30
    Admstor  
       2018-01-20 15:59:26 +08:00
    我怀疑你用的是所谓 win 下的一键安装包...
    那种东西性能烂的要死,撑死了给开发做一个本地调试用

    标准 win 下跑 php 当然是用 IIS
    win 下没有比 IIS 性能更好的 web
    gouchaoer
        31
    gouchaoer  
       2018-01-20 16:06:19 +08:00 via Android
    第一把 wamp 的 mysql 换成正式版的 mysql,那个 mysql 性能有问题
    第二打开 opcache
    至于 Apache 本身不大可能
    90safe
        32
    90safe  
    OP
       2018-01-20 16:11:33 +08:00
    @xutonglei86 对的,这是其中一个原因,我刚刚修改以后速度提升了不少,不过还是有些差距,linux 比 win 能快 2-3 倍左右,一个 600ms 一个 1800ms。两边的 mysql 配置文件是相同的,已经排除了 nginx、php-fpm 的原因。
    90safe
        33
    90safe  
    OP
       2018-01-20 16:12:24 +08:00
    @gouchaoer 我刚刚把 mysql 版本更换了,配置文件也跟 linux 的调一样,速度还是没有改变,大概是 2-3 倍的差距
    riggzh
        34
    riggzh  
       2018-01-20 16:24:49 +08:00
    你说的延迟是 phpmyadmin 首页那个吗
    90safe
        35
    90safe  
    OP
       2018-01-20 17:31:48 +08:00
    @riggzh 首页跟 API 接口都调试过
    riggzh
        36
    riggzh  
       2018-01-20 17:56:10 +08:00
    @90safe 34# 从哪看的 我试试我的
    l12ab
        37
    l12ab  
       2018-01-20 19:15:43 +08:00 via iPhone
    好像 mysql 默认访问 ipv6 的 localhost,慢是因为 hosts 文件里没有添加 v6 的 localhost
    LeungJZ
        38
    LeungJZ  
       2018-01-20 20:07:58 +08:00
    先说下,我的课设是 lnmp 环境,其中 m 是 mongodb.

    linux 上的 lnmp 查询+渲染,共费时 0.2s
    window8.1 上的 wnmp 查询+渲染,共耗时 1s 这个真么很无语。
    Yunhao
        39
    Yunhao  
       2018-01-20 20:59:57 +08:00 via iPhone
    我也遇到了这样的问题。架设的内部 PHP 网站,只让用 windows,真是头疼。
    neilyoone
        40
    neilyoone  
       2018-01-20 21:10:06 +08:00
    搞这么复杂,换 Linux 不就好了,哪这么多事。
    tulongtou
        41
    tulongtou  
       2018-01-21 00:51:18 +08:00 via iPhone
    likuku
        42
    likuku  
       2018-01-21 01:07:47 +08:00
    @Yunhao 有啥头疼的,谁拍板谁负责,慢就慢呗。。内部站嘛,又不会被顾客骂。
    likuku
        43
    likuku  
       2018-01-21 01:08:17 +08:00
    Win 上妥妥用 C#/Java 就对了嘛。。。何必呢。
    msg7086
        44
    msg7086  
       2018-01-21 04:37:02 +08:00
    @abcbuzhiming
    我没用过 IIS 下的 FastCGI,不过我在微软官网找到这么一段话。

    PHP Process Recycling Behavior

    Ensure that FastCGI always recycles the php-cgi.exe processes before the native PHP recycling kicks in. The FastCGI process recycling behavior is controlled by the configuration property instanceMaxRequests. This property specifies how many requests the FastCGI process will process before recycling.

    如果微软在瞎瘠薄说,那算我输。

    @xutonglei86
    Linux 下 localhost 是直接使用 unix socket 连接的,在 Windows 下,类似的技术叫 named pipe,你可以查下文档看怎么打开了用。改用 IP 以后会走网络套接字,性能可能会有影响。
    另外 nginx 没有 epoll,小流量下没事,大流量会很惨。
    AntiGameZ
        45
    AntiGameZ  
       2018-01-21 08:34:04 +08:00
    @est DPDK 有对比么?求~
    WispZhan
        46
    WispZhan  
       2018-01-21 08:38:01 +08:00 via Android
    IIS+SQL server。其他不变
    zjlin1984
        47
    zjlin1984  
       2018-01-21 09:28:33 +08:00
    学习了
    falcon05
        48
    falcon05  
       2018-01-21 10:45:46 +08:00 via iPad
    都在一台服务器的话,高并发大流量下先挂的是往往是 PHP 或者 MySQL,而不是 IIS 或者 nginx。
    Zzzzzzzzz
        49
    Zzzzzzzzz  
       2018-01-21 10:53:07 +08:00
    win 下面跑, IIS 和 php 都不是坑, mysql 才是.......
    realpg
        50
    realpg  
       2018-01-21 11:46:11 +08:00
    @abcbuzhiming #26
    你的 IIS 是几?不会是 6+山寨的 fastcgi 吧……

    fastcgi 的意思就是程序脱离请求启动,独立处理请求,而且实际上,iis 官方带的 fastcgi 引擎就是常驻内存的,而且因为他的默认参数每个 fastcgi 处理的请求数太少,每次都是进程堆满服务器,得手动调参
    realpg
        51
    realpg  
       2018-01-21 11:48:39 +08:00
    @90safe #7
    如果你要在 windows 下用好 mysql,那你一定得会调参,否则这个差距无法弥补

    基本上,mysql 的预编译二进制包,如果调参良好,大概只有 25%左右的性能差距,这个差距如果想进一步缩小,NTFS 的分区参数,还有读写机制都得改,可能要源代码自己编译
    cy97cool
        52
    cy97cool  
       2018-01-21 11:49:09 +08:00
    如果在 windows 装个 VirtualBox 跑 Linux LNMP 性能又如何呢。。。
    jhdxr
        53
    jhdxr  
       2018-01-21 13:15:16 +08:00
    @cy97cool 死的非常惨,目测最大的瓶颈会在 virtualbox 上
    cdffh
        54
    cdffh  
       2018-01-21 13:45:52 +08:00
    我也发现这个问题了. 很烦.
    deepkolos
        55
    deepkolos  
       2018-01-21 14:18:22 +08:00
    php 链接数据哪里填写 localhost 和 127.0.0.1 性能差距 1s, 现在机子的 wnmp 都是一个一个跟着官网安装, 没使用集成环境, PHP 数据库长链接,opcache 等基本优化设置,TTFB 可以达到 8ms
    deepkolos
        56
    deepkolos  
       2018-01-21 14:26:40 +08:00
    opcache 开启 enable_file_override 可以减少框架带来的损耗,磁盘 IO 比 cpu 宝贵些
    crist
        57
    crist  
       2018-01-21 14:26:55 +08:00
    只要菜逼才会把数据库链接设成 localhost。
    wekw
        58
    wekw  
       2018-01-22 13:38:43 +08:00
    Windows 下最建议使用 IIS,不行的话可以用 Apache,不用怎么配置。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2035 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 00:02 · PVG 08:02 · LAX 16:02 · JFK 19:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.