以前做项目习惯用 lnmp,前些天老板说要 win 系统才行,那我就用了 wamp。结果刚刚老板问我,为什么那么卡?我就比对了下速度。
两边机器配置完全一样,只是环境不同,一个是 lnmp,一个是 wnmp
先是 wamp,响应速度 1300ms,我就改成 nginx,响应速度变成 1200ms。
接着 lnmp,响应速度 120ms。
请问这是啥情况?有什么办法查看具体卡在哪个环节吗?是 nginx、还是 mysql、还是 php-fpm ?
1
likuku 2018-01-20 14:54:34 +08:00
Win 为何不用 IIS
|
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 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 |
3
90safe OP @likuku IIS 用得少,不太习惯。刚刚试了下不读取数据库,打开 phpmyadmin 页面,linux 是 100ms,win 是 400ms。这样都有四倍的差距。
|
4
zjsxwc 2018-01-20 14:59:27 +08:00
win 的进程开销比 Linux 的进程开销大很多吧
|
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,你的性能依然不会高到哪里去的 |
6
endlessing 2018-01-20 15:07:41 +08:00
莫不是连了 MySQL ?
|
7
90safe OP @abcbuzhiming 还有一个就是,我刚刚试了下 phpmyadmin 的登录时间,linux 是 300ms,win 是 1600ms,这差距。。。。登录操作 = 连接读取数据库,也就是说在 mysql 的环节也慢。。。
|
8
cy97cool 2018-01-20 15:10:37 +08:00
Windows 服务器用 Nginx+PHP 有 xxfpm,可以让 PHP 常驻内存
|
9
chenqh 2018-01-20 15:11:07 +08:00
不应该啊,如果这么慢,php 在 windows 怎么有人用?
|
10
wkan 2018-01-20 15:12:40 +08:00 via iPhone
你要不要检查下 opcache 开没开
|
11
est 2018-01-20 15:14:14 +08:00 via Android
iis 快不仅是因为它用了 iocp,而是因为别人 http 处理逻辑是在内核实现的 http.sys 。性能比 linux 老内核高 50%没问题。只有 khttp 能一战
不过然并卵,dpdk 发来贺电。 |
12
jasontse 2018-01-20 15:14:22 +08:00 via iPad 1
@abcbuzhiming 错很大。fpm 全称 FastCGI Process Manager,两种系统毫无疑问都是 FastCGI,执行后就销毁进程的叫 CGI。
Linux 和 Windows 确实存在性能差距,但是楼主的问题主要是调参,就这样回答楼主的问题无异于闭着眼睛开药。 |
15
tomczhen 2018-01-20 15:29:02 +08:00
其实楼主只是想找论据支持自己说服老板不要用 Windows Server 而已,你们都这样客观的分析问题就违背楼主初衷了,直接说 Windows Server 就是这样垃圾,一样的程序比 Linux 慢十几倍就 O 了。
|
16
90safe OP 大家好,我回来了,我把数据库连接从 localhost 改成 127.0.0.1,速度从 1300ms 提升到了 300ms,现在差距缩小剩 3 倍了。
|
17
liuxu 2018-01-20 15:33:26 +08:00
看看静态页访问速度怎样,如果静态也也慢就是 nginx 和 win 的问题,如果只是 php 慢,就用 xhprof 分析一下 php 这边哪部耗时了
|
18
90safe OP 虽然速度提升了不少,但是还是慢,还有办法优化吗? localhost 是因为 php-fpm 会检测是 ipv4 还是 ipv6,导致变慢,直接指定 127.0.0.1 就跳过检测了。现在差距还有 3-4 倍,急,在线等!
|
20
90safe OP @liuxu 用 phpmyadmin 的首页来测试,是没有涉及数据库操作,只有 nginx+php-fpm,速度是相差很小的的,大概 30ms 而已。但是如果登录连接数据库的话,速度就慢了很多很多。如果是 mysql 的问题,能怎么优化呢?
|
23
likuku 2018-01-20 15:43:27 +08:00
读多写少,那么可以上 memcache
|
24
ivmm 2018-01-20 15:44:30 +08:00
建议你买个 Plesk 面板 Windows 版 或者 Win 上 Docker LNMP
傻逼老板给你的任务,你能被傻逼老板带节奏嘛,不行的呀 |
26
abcbuzhiming 2018-01-20 15:45:24 +08:00
@jasontse 你自己到底用 IIS 下的 PHP 没有? IIS 下自带的 fastcgi 就是不能常驻进程的,必须用另外一个楼提到的 xxfpm,而 linux 下的 php-fpm 默认就是常驻进程。我用过我才说这个话
|
27
xutonglei86 2018-01-20 15:55:14 +08:00
数据库连接地址改成 127.0.0.1,win 系统下,如果数据库连接地址设置为 localhost 的话,会优先寻址 ipv6。ipv6 连接不上才会寻址 ipv4,所以延迟比较高,改成 ipv4 地址即可。。
|
28
ivmm 2018-01-20 15:58:37 +08:00
@xutonglei86 还有这层说法,学到了
|
29
ivmm 2018-01-20 15:58:58 +08:00
@xutonglei86 不过貌似一般都是在 hosts 文件里写一段 127.0.0.1 localhost
|
30
Admstor 2018-01-20 15:59:26 +08:00
我怀疑你用的是所谓 win 下的一键安装包...
那种东西性能烂的要死,撑死了给开发做一个本地调试用 标准 win 下跑 php 当然是用 IIS win 下没有比 IIS 性能更好的 web |
31
gouchaoer 2018-01-20 16:06:19 +08:00 via Android
第一把 wamp 的 mysql 换成正式版的 mysql,那个 mysql 性能有问题
第二打开 opcache 至于 Apache 本身不大可能 |
32
90safe OP @xutonglei86 对的,这是其中一个原因,我刚刚修改以后速度提升了不少,不过还是有些差距,linux 比 win 能快 2-3 倍左右,一个 600ms 一个 1800ms。两边的 mysql 配置文件是相同的,已经排除了 nginx、php-fpm 的原因。
|
33
90safe OP @gouchaoer 我刚刚把 mysql 版本更换了,配置文件也跟 linux 的调一样,速度还是没有改变,大概是 2-3 倍的差距
|
34
riggzh 2018-01-20 16:24:49 +08:00
你说的延迟是 phpmyadmin 首页那个吗
|
37
l12ab 2018-01-20 19:15:43 +08:00 via iPhone
好像 mysql 默认访问 ipv6 的 localhost,慢是因为 hosts 文件里没有添加 v6 的 localhost
|
38
LeungJZ 2018-01-20 20:07:58 +08:00
先说下,我的课设是 lnmp 环境,其中 m 是 mongodb.
linux 上的 lnmp 查询+渲染,共费时 0.2s window8.1 上的 wnmp 查询+渲染,共耗时 1s 这个真么很无语。 |
39
Yunhao 2018-01-20 20:59:57 +08:00 via iPhone
我也遇到了这样的问题。架设的内部 PHP 网站,只让用 windows,真是头疼。
|
40
neilyoone 2018-01-20 21:10:06 +08:00
搞这么复杂,换 Linux 不就好了,哪这么多事。
|
43
likuku 2018-01-21 01:08:17 +08:00
Win 上妥妥用 C#/Java 就对了嘛。。。何必呢。
|
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,小流量下没事,大流量会很惨。 |
46
WispZhan 2018-01-21 08:38:01 +08:00 via Android
IIS+SQL server。其他不变
|
47
zjlin1984 2018-01-21 09:28:33 +08:00
学习了
|
48
falcon05 2018-01-21 10:45:46 +08:00 via iPad
都在一台服务器的话,高并发大流量下先挂的是往往是 PHP 或者 MySQL,而不是 IIS 或者 nginx。
|
49
Zzzzzzzzz 2018-01-21 10:53:07 +08:00
win 下面跑, IIS 和 php 都不是坑, mysql 才是.......
|
50
realpg 2018-01-21 11:46:11 +08:00
@abcbuzhiming #26
你的 IIS 是几?不会是 6+山寨的 fastcgi 吧…… fastcgi 的意思就是程序脱离请求启动,独立处理请求,而且实际上,iis 官方带的 fastcgi 引擎就是常驻内存的,而且因为他的默认参数每个 fastcgi 处理的请求数太少,每次都是进程堆满服务器,得手动调参 |
51
realpg 2018-01-21 11:48:39 +08:00
@90safe #7
如果你要在 windows 下用好 mysql,那你一定得会调参,否则这个差距无法弥补 基本上,mysql 的预编译二进制包,如果调参良好,大概只有 25%左右的性能差距,这个差距如果想进一步缩小,NTFS 的分区参数,还有读写机制都得改,可能要源代码自己编译 |
52
cy97cool 2018-01-21 11:49:09 +08:00
如果在 windows 装个 VirtualBox 跑 Linux LNMP 性能又如何呢。。。
|
54
cdffh 2018-01-21 13:45:52 +08:00
我也发现这个问题了. 很烦.
|
55
deepkolos 2018-01-21 14:18:22 +08:00
php 链接数据哪里填写 localhost 和 127.0.0.1 性能差距 1s, 现在机子的 wnmp 都是一个一个跟着官网安装, 没使用集成环境, PHP 数据库长链接,opcache 等基本优化设置,TTFB 可以达到 8ms
|
56
deepkolos 2018-01-21 14:26:40 +08:00
opcache 开启 enable_file_override 可以减少框架带来的损耗,磁盘 IO 比 cpu 宝贵些
|
57
crist 2018-01-21 14:26:55 +08:00
只要菜逼才会把数据库链接设成 localhost。
|
58
wekw 2018-01-22 13:38:43 +08:00
Windows 下最建议使用 IIS,不行的话可以用 Apache,不用怎么配置。
|