如何构建高性能 Web 网站 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
moji2016
V2EX    Python

如何构建高性能 Web 网站

  •  
  •   moji2016 2015-12-18 09:27:37 +08:00 6566 次点击
    这是一个创建于 3593 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如让 Web 网站的,页面响应速度更快,支持的在线人数更多。是用 CDN,mysql 主从分离, redis,还有性能高的 web 框架,比如 java 的 spring,go 的 revel , nodejs 的 express , python 的 flask 居中, rails 次之, php 的 laravel 性能最低。在众多的因素中, web 框架自身的性能占高性能的 web 站点中的多少比例。

    例如本站 v2ex,从支持 100 人在线,到 1000 人在线,到 10000 人在线,到 100000 人, 1000000 人在线等,是换站点 WEB 框架为高性能的语言的 WEb 框架就能解决。还是必须要增加硬件和 CDN , redis 缓存, mysql 主从分离这些才能解决。哪种方案性价比高。框架本身性能可以忽略不计吗?哪怕你用最慢的 laravel 框架。

    总而言之一句话,应付大流量,并且页面快速响应,不断掉,上面哪些因素占主要的。哪些是可以忽略的次要因素。

    32 条回复    2015-12-19 00:34:47 +08:00
    nonozone
        1
    nonozone  
       2015-12-18 09:36:11 +08:00   2
    这个首先要考虑你所要面对的具体状况。现在 100 人在线就考虑 100 人在线的情况, 1000 人再考虑 1000 的时候。

    凭空谈有啥好谈的,不同的情况所采取的方式肯定也不同,各种成本,是技术成本比较高,还是操作成本比较高还是单纯的金钱成本,都有取舍。哪种方案都不是千面杀手。
    TangMonk
        2
    TangMonk  
       2015-12-18 09:42:00 +08:00
    moji2016
        3
    moji2016  
    OP
       2015-12-18 09:43:12 +08:00
    @nonozone 关键是现在算不出来用户量增长的速度,所以要考虑尽可能多的满足快的增长。
    附各框架性能链接:
    https://www.techempower.com/benchmarks/#section=data-r11&hw=peak&test=query
    当前好像 php 最易用 laravel 框架性能最低。
    moji2016
        4
    moji2016  
    OP
       2015-12-18 09:46:10 +08:00
    @TangMonk 如果一开始选择了最好用的,但是性能最低的框架, 以后网站打不开了,会不会有大的麻烦和烦恼。就像刚开始配置了一台赛扬的机器,结果确发现慢得打开几个程序就卡死。这时维修更换成本会不会太大了些。 web 框架是不是也和 CPU 装机这种是一个道理,一样吗。
    oott123
        5
    oott123  
       2015-12-18 09:47:58 +08:00 via Android
    算不出增长的网站,要么不合法,要么烧钱…
    反正两者来钱都很快,扛不住了就上机器,上不了了就出钱找人重写…
    JohnLou
        6
    JohnLou  
       2015-12-18 09:50:05 +08:00
    @moji2016 我用的 CI 框架在 10 几块钱一个月的虚拟主机上跑得秒开,之后赶时髦换成 laravel 明显没那种体验了又换回来 CI ,我觉得框架并不是越先进越好,我用 CI 三年了,源码都快背熟了,哪里可以优化就优化提速。
    moji2016
        7
    moji2016  
    OP
       2015-12-18 09:54:48 +08:00
    @oott123 是不是 PHP 的框架和网站,每当内存和 CPU 加一倍时,性能就会提升一倍,支持的访问量就多一倍呢。
    Lucups
        8
    Lucups  
       2015-12-18 09:55:39 +08:00
    要考虑的因素太多了。

    你的网站主要是什么业务?视频?论坛?博客?图库?不用的业务场景重点优化对象不同。
    另外就是现在云服务多如牛毛,可以适当地用上。比如图片视频的什么的占流量的直接放云存储,不要放应用服务器。

    此外就是监控,根据日志分析你的应用瓶颈在哪,然后做有针对性的优化。
    moji2016
        9
    moji2016  
    OP
       2015-12-18 09:57:42 +08:00
    @JohnLou 是的,在当前情况下,用 CI3 感觉像穿中山装的感觉,看上面的测评 ci 也比 laravel 性能好,比 flask 略低。和 java go nodejs 哪些框架没得比。 ci 比 rails 略高。为何没有 django rails 这可是世界上有大型网站使用的技术。 laravel 也能通过架构解决大型站点的性能问题吗,像 rails 和 django 一样,因为没有大型成功网站案例,所以目前对他的性能可用性抱怀疑态度。
    wy315700
        10
    wy315700  
       2015-12-18 10:00:34 +08:00
    感觉楼主是来黑 PHP 的
    okeydokey
        11
    okeydokey  
       2015-12-18 10:02:36 +08:00   1
    @moji2016 可以看下《构建高性能 web 站点》,网站初期活下来时关键,因此一开始选用最好用的,后期真的做大了再考虑性能,这些都是幸福的烦恼,不用太担心,有那么多轮子可以借鉴,淘宝初期就是 php 后来才切到 java 的
    yernsun
        12
    yernsun  
       2015-12-18 10:05:53 +08:00
    看看是计算密集型的还是数据业务密集型的吧,计算密集的,程序语言肯定是比较重要的。如果是数据业务密集型,那么瓶颈往往都在 DB 上,换程序语言不如加缓存、提高磁盘 IO 甚至优化 SQL 来的实在。
    kongkongyzt
        13
    kongkongyzt  
       2015-12-18 10:16:06 +08:00   1
    我猜楼主可能没有做过高并发和海量流量的项目, 或者是没有很完整地经历过一个网站从单机起步, 随着流量的增长架构不断进化的过程, 当然, 并不是什么人都有机会经历这个过程收获技术上的巨大成长的

    一般来说, 制约性能的主要问题往往不是使用的编程语言和框架, 这些框架的测试有一定的参考性, 但不是性能热点, 对于一般的业务来说, 性能开销很大程度上集中在网络, 磁盘 IO, 数据库和你所设计的架构, 而做的优化也会和你的架构, 你的业务形式息息相关. 性能优化的方式和手段有很多, 常见的比如异步化, 服务化(RPC, web service), 分布式. 我觉得最立竿见影的方式是负载均衡, 效果比较明显.很多公司到最后采用自研框架的形式, 我觉得性能倒不是非常重要的原因, 而是业务需要高度的定制化, 原来的开源框架已经不能满足业务的需求了
    nonozone
        14
    nonozone  
       2015-12-18 10:18:58 +08:00
    @moji2016 技术不确定的时候,就先把业务搞好。只要业务发展起来了,后面的技术都可以慢慢改善。但是前期技术高大上,但是业务层面萎靡不振,又有何用。

    并且就算你技术上感觉上已经搞了一个非常牛逼的结构,你会发现,一旦跟你业务结合起来的时候,麻烦的问题一样一个接着一个。

    反正就是,先从你熟悉的弄。不熟悉的东西,一方面你无法评测这个是不是适合自己,而是出现问题自己也不知道怎么解决。
    baoma511
        15
    baoma511  
       2015-12-18 10:20:14 +08:00
    k9982874
        16
    k9982874  
       2015-12-18 10:23:45 +08:00
    web 简单就是堆机器上 haproxy
    baoma511
        17
    baoma511  
       2015-12-18 10:24:00 +08:00
    不过我也理解楼主,我目前也有这样的状态,当然,前期要把架构选型做好,方便后期扩展和升级,还有就是我深深的理解,随便做一个站很容易,想做一个不随便的站真的不容易,会牵涉到很多东西,不单单是业务方面的,还有网络方面的,加油!
    reeco
        18
    reeco  
       2015-12-18 10:30:20 +08:00
    你的机器<10 所有应用 all in one 的时候,性能瓶颈在于 orm 和 io ,在框架上想方设法节省的一点性能可能一句 SELECT 就浪费了
    tonyVex
        19
    tonyVex  
       2015-12-18 10:35:17 +08:00
    磁盘 IO , CDN ,高可用,负载均衡,缓存,读写分离等 。架构上面 ,不同应用不同的场景切入点不一样。
    zonghua
        20
    zonghua  
       2015-12-18 11:20:24 +08:00 via iPhone
    我好奇 Spring 映射的 rmurl 多了会不会影响性能
    c742435
        21
    c742435  
       2015-12-18 11:52:13 +08:00 via Android
    一个这样问问题的人 /团队,很大可能没有构建那样高性能系统的技术实力。
    告诉你个最简单的办法,上云,数据库鼠标点点就能扩展,业务服务器鼠标点点就能随便加。等到云满足不了你们的需求了,你们也有钱招能搞定的人了。
    moji2016
        22
    moji2016  
    OP
       2015-12-18 12:05:59 +08:00
    @c742435 框架性能测试中,那些排名高的框架,和那些排名低下的框架,之间不做选择吗。
    ryd994
        23
    ryd994  
       2015-12-18 13:00:48 +08:00 via Android
    一开始能考虑一下可扩展性自然是好的,考虑一下就够了。
    Web 前端一般是可以直接用 loadbalancer 直接横向扩展的。最后的瓶颈一般落在数据库等后端上。所以前端框架就算选错了,多用点资源也没什么大不了的。
    ryd994
        24
    ryd994  
       2015-12-18 13:04:40 +08:00 via Android
    @moji2016 会什么用什么,什么顺手用什么。还有比 flask 更快的 bottle 呢,还有更快的不用框架裸写 wsgi 呢。互联网企业一般开发重点不在性能上,因为入我上面所说,横向扩展不难。重点一般是迭代周期和可用性。只要能快速出新功能,而且顶住不出大篓子,就是好框架。
    shajiquan
        25
    shajiquan  
       2015-12-18 13:19:03 +08:00
    Google 有很多项目,在很多项目发起时,都做了大量的提前优化,因为感觉会人多到爆。但事实并非如此。

    前几天看新闻有讲。
    loading
        26
    loading  
       2015-12-18 13:28:20 +08:00 via Android
    从一开始就用 go …
    c742435
        27
    c742435  
       2015-12-18 15:14:52 +08:00 via Android
    @shajiquan Google 有钱有技术,而且真的有可能人多到爆。
    Google 绝对不会问楼主的问题。

    @loading 一开始就有 go 开发能力的团队还是少。
    loading
        28
    loading  
       2015-12-18 15:16:20 +08:00 via Android
    @c742435 直接找 python 和 go ,差不太多。
    cnbiglee
        29
    cnbiglee  
       2015-12-18 15:21:04 +08:00
    如果预计不到以后的情况,那就到一个阶段做一个改进。可以到时看瓶颈在哪,再决定做哪方面的改进。
    liujiangbei
        30
    liujiangbei  
       2015-12-18 18:13:30 +08:00
    空谈误国,实干兴邦,楼主提到的这些技术栈都能构建高性能 web 站点。楼主应该从实际情况出发,找到瓶颈是什么?
    neoblackcap
        31
    neoblackcap  
       2015-12-18 18:51:25 +08:00
    我见过很多刚开始就考虑高性能的公司,现在他们都死了。

    便宜,高性能,好找人,只能取两者
    Daddy
        32
    Daddy  
       2015-12-19 00:34:47 +08:00
    没什么,归结起来就是:心太大,总想着一步到位。 还没网站,更没运营,就想着最高起点,用最好的语言,用最好的服务器,用最好的宽带。

    还没女朋友,就想着各种旅行、各种姿势、各种体位……
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     904 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 19:12 PVG 03:12 LAX 12:12 JFK 15:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86