`
pan_java
  • 浏览: 286127 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

构建高性能Web站点 学习笔记

阅读更多
第二章 数据的网络传输

数据是如何发送
1.应用程序首先得将要发送的数据写入该进程的内存地址空间。通常程序开发中变量赋值。
2.应用程序通过系统函数接口(比如SEND 函数) 向内核发出系统调用,由系统内核来进行随后的操作。它将这些数据从用户态内存复制到由内核维护的一段称为内核缓冲区的内
   存地址空间。这块地址空间大小通常是有限的。所有要发送的数据将以队列的形式进入这里。这些数据可能来自于多个进程。每块数据都有一定的额外记号来标记它们的去向
   如果要发送的数据比较多。那么该系统调用需要多次进行。每次复制一定的数据大小。这个大小取决于网络数据包的大小以及内核缓冲区的承载能力。重复的系统调用体现在
   应用编程层面重复调用SEND函数。
3.当数据写入内核缓冲区。内核会通知网卡控制器前来取数据,同时CPU转而处理其他进程。网卡控制器接到通知后。便根据网卡驱动信息得知对应内核缓冲区的地址将要发送的数据
   复制到网卡缓冲区中。注意在以上一系列的数据复制中。数据始终连接两端设备的总线宽度复制。也就是字节的整数倍。
4.网卡缓冲区中的数据需要发送的到线路中,同时释放缓冲区来获取更多要发送的数据。
5.发送时,网卡会使用内部特定的物理装置来生成可以传播的各种信号,比如在使用铜线线路中,网卡会使用根据“0”和“1”的变化产生不同的电信号。而使用光纤线路时
   网卡会产生不同的光信号
  
铜线中电信号的传播速度大约为2.3 × 10 ^8,光纤中光信号的传播速度大约为 2.0 × 10^8

我们所讲的带宽的指数据在发送速度。比如百兆网卡便是指网卡的最大发送速度为100Mbps.就是网卡在1秒最多可以发出100Mb的数据。

信号的接收能力至关重要,如果接收能力跟不上,发送能力不可能提高

数据链路层对于数据帧传输控制完全是按照接收方的接收能力来确定发送速度的。

光纤中光的传导损耗比电在电缆传导的损耗低的多。

响应时间 = 发送时间 + 传播时间 + 处理时间

下载进程一般要将接收的数据即时写入磁盘,才会进行下一次的接收数据的系统调用。而写入磁盘的过程需要经历位于内核态内存中磁盘高速缓冲区的转发。



第三章  服务器并发处理能力

  压力的描述一般包括两部份即并发用户数和总请求数。
 
  吞吐率前提包括:并发用户数,总请求数,请求资源描述。
 
  最大并发数与请求性质有关
 
  压力测试软件 apache 附带ab ,loadRunner,jmeter
 
  现代计算机的DMA技术可让CPU不参与I/O操作全过程。比如进程通过系统调用,使得CPU向网卡或者磁盘等I/O设备送出指令。然后进程挂起,释放CPU资源,等待I/O设备
  完成工作后能过中断来通知进程重新就绪。
 
  进程的高度由内核来进行
 
  每个进程都有自己独立的内存地址空间和生命周期。当子进程被父进程创建后,便将父进程地址空间的所有数据复制到自己的地址空间,完全继承父进程的所有上下文信息
  它们之间可能通信。但是不互相依赖,也无权干涉彼此的地址空间。
 
  轻量级进程减少了内存开销,并为多进程应用程序共享提供了直接支持。但是其上下文切换的开销还是在所难免的。
 
  线程切换的开销相比进程和轻量级进程都要少些。
 
  在单CPU上任何时刻只有一个进程处于运行状态,而其他的进程有的处于挂起状态并等待就绪,有的已经就绪等待CPU时间片,还有的处于其他状态。
 
  进程调试器更加偏爱I/O密集型的进程,因为这些进程在发起I/O操作后通常都会阻塞(除非使用异步I/O),不会占用太多CPU时间。这意味其他进程都可以更好地交错运行。
 
  “上下文”正是表示进程运行到何种程度。
 
  进程拥有自己独立的内存空间,但是每个进程都只能共享CPU寄存器,一个进程被挂起的本质就是将它在CPU寄存器中的数据拿出来暂存在内核态堆栈中,而一个进程恢复工作的
  本质就是将它的数据重新装入CPU寄存器。这段装入和移出的数据我们称为“硬件上下文”。它也是进程上下文的一部份。除此之外,进程上下文中还包括了进程运行时需要的
  一切状态信息。
 
  使用Nmon工具监视服务器每秒上下文切换次数
 
  如果我们希望服务器支持较大的并发数,那么就要尽量减少上下切换次数,最简单的做法就是减少进程数。尽量使用线程并配合其他I/O模型来设计并发策略。
 
  在请求大量小文件的时候,长连接(Keep-Alive)的有效使用可以减少大量重新建立连接的开销,有效加速性能。
 
  对于长连接的有效使用,关键一点在长连接超时时间的设置。
 
  任何一种技术都有它的应用范围,能够意识到环境的不同而选择合适的技术才是明智之举。
 
 
 
  第4章 动态内容缓存
 
  缓存更加注重的是策略,也就是说缓存命中率,如果每次都能在缓存中找到需要的数据,那是最理想的结果,如果每次都不在缓存找不到需要的数据,那缓存将变得
  毫无意义。
 
  HTML局部静态化 apache SSI技术。
 
  第6章 浏览器缓存
 
  Last-Modified 和 ETag ,Expires(过期之前不会和服务器交互)
 
  三种请求页面方法
  1.Ctrl + F5
    这种方式可以叫强制刷新,它使得网页以及其中的所有组件都直接向WEB服务器发送请求,并且不使用缓存协商。这样的目的是获取所有内容的最新版本。你也可以按
    住Ctrl键然后单击浏览器刷新按钮得到同时的结果
  2. F5
     它能够让Last-Modified发挥效果,但对是Expires无效
  3.转到,点击超连接
     浏览器会对所有没有过期的内容直接使用本地缓存,所以Expires标记只对这种方式有效.
    
  第7章 反向代理缓存
   
    开源软件:Varnish
   
    ESI技术是在HTTP代理服务器上组装内容,包括反向代理。
   
   
  第九章 WEB组件分离
 
     使用用不同的域名对WEB组件进行分离后,另一个好处随之而来,那就是提高了浏览器在下载WEB组件时的并发数。
    
     浏览器的最大并发数限制有一个前提,那就是对于同一个域名下组件才有效,也就是说,浏览器会为每个域名维护不同的下载队列。
    
     下载在线测试工具:http://site-perf.com
    
第十章 分布式缓存

     memcached
    
     memcached 监控 cacti
    
第11章 数据库性能优化
  
    80%的性能问题往往都是由20%的错误导致的。
   
    查看mysql运行:show status ,show innodb status
   
    mysql日志查看工具 mysqlreport
   
   大多数情况下,索引扫描当然要比全表扫描获得更好的性能,但这并不是绝对的,如果要查找的记录占据整个数据表的很大比例,那么使用索引扫描反而性能更差。
  
   通过唯一索引来约束记录插入时的唯一性,那么索引本身的计算开销必然会增加,因为当你插入记录的时候会涉及额外的唯一性检查。
  
   explain type const 使用索引 ,type All 全表扫描。 type ref 关联查询索引
  
   一次查询对一个数据表只能使用一个索引
  
   组合索引“最左前缀”基本原则
  
   explain type 为 index 表示这个查询只需要在索引中扫描即可
  
   对于 group by 的查询,数据库一般需要先将记录分组后放置在新的临时表中,然后分别对它们进行函数计算。
  
   explain extra -> using filesort 和 using temporary非常不受欢迎,它们越少越好。
  
   Innodb 类型表中数据的存储顺序是按照主键来排序的
  
   一个包含多个字段的组合索引尺寸可能已超过数据本身
  
   组件索引(key1,key2)索引与(key2,key1) 索引完全不同
  
   查看运行慢SQL工具 mysqldumpslow ,mysqlsla(推荐)
  
   MyISAM 类型的表只缓存索引,不缓存数据
  
   行锁的价值并不在它本身的速度,而是存在特定的应用场景中。
  
   update 密集型的场景下,行锁定并不是救世主。
  
   mysql 中 Innodb除了支持行锁定外,还支持事务。
  
   innodb_flush_method = O_DIRECT 这样设置,Innodb将可以跳过文件系统缓冲区,提高I/O性能。
  
   mysql缓存机制,当一个数据有更新操作(update,insert) 后,那么涉及这个表的所有查询缓存都会失效。
  
   磁盘上创建临时表的开销最大,尽量不要在磁盘上创建。
  
   show processlist 中看到查询状态为 copying to tmp table on disk ,这意味MYSQL将临时表从内存移到磁盘,节省内存。
  
   非主键字段之间不能存在依赖关系
  
   非关系性数据库 MemcacheDB
  
  
   第12章  WEB负载均衡
  
   HTTP重定向,DNS负载均衡,IP负载均衡(NAT),LVS
  
  
   第13章  共享文件系统
  
   NFS ,Samba
  
   第15章  分布式文件系统
  
   MogileFS ,Hadoop
  
  
    第16章  数据库扩展
   
    MySql的主从复制是依据主服务器的二进制日志进行的。
   
    Mysql Proxy工人在应用程序和MYSQL服务器之间,负责所有请求各响应数据转发。
   
    在进行数据库模型设计以及编写应用程序时候,都应该尽量减少使用联合查询
   
    Spock Proxy 实现水平分区调度
   
    第17章 分布式计算
   
    Gearman 用来实现远程函数调用
   
    MemcachedQ是一个单纯的分布式消息队列服务
   
   
    第18章 性能监控
   
    Nmon是一款工作在服务器本地的实时监控软件
   
    监控宝 www.jiankongbao.com
   
 
 
 
 

1
0
分享到:
评论

相关推荐

    SOLR学习笔记

    ### SOLR学习笔记 #### 一、Solr简介与特点 **Solr** 是一种开源的企业级搜索平台,它是基于 **Lucene Java** 构建的。Solr 的设计目标是为了提供高性能、高可用性的搜索服务,适用于各种规模的企业级应用。 **...

    flutter 环境搭建-flutter环境搭建,很不错的学习笔记

    其核心优势在于跨平台性和高性能表现。 **跨平台性**:Flutter 的跨平台特性意味着开发者可以使用同一套代码库来部署应用程序至多个不同的平台。这些平台包括但不限于: - **移动端**:Android 和 iOS。 - **Web端...

    笔记资料.zip

    例如,Java应用处理业务逻辑,Nginx负责静态资源服务和负载均衡,两者共同构建出高性能的Web服务架构。 这份笔记资料可能详细记录了作者在学习过程中遇到的问题、解决方法以及一些实用技巧,对于初学者和有经验的...

    easyUI笔记

    ### easyUI笔记知识点详解 #### 一、什么是jQuery EasyUI? **jQuery EasyUI** 是一组基于 jQuery 的 UI 插件集合。它的目标是帮助 Web 开发者更容易地创建功能丰富且美观的用户界面。通过使用 **jQuery EasyUI**...

    FE-blog-repository:我的前端学习笔记仓库

    6. **Vue.js**:一个用于构建用户界面的渐进式框架,设计时考虑了易用性、可维护性和高性能。Vue允许开发者通过声明式渲染和组件化来构建复杂的应用。 7. **ES6**:ECMAScript 6,也被称为ES2015,是JavaScript语言...

    尚硅谷_韩顺平_Go语言核心编程.docx

    - **后端服务开发**:由于 Golang 高效的性能表现,非常适合用于构建高性能的 Web 服务器和 API 服务。 - **云计算/云服务后台**:随着云计算的发展,越来越多的企业开始采用 Golang 来构建云服务的后端系统。 ####...

    Portal门户开发笔记

    IBM WebSphere Portal是一款强大的企业级门户平台,用于构建和管理高度可定制的、集成了多种应用和服务的用户入口。...无论是新手还是经验丰富的开发者,都可以通过这个笔记深入学习和提升自己的技能。

    Nginx-笔记1

    【Nginx】是俄罗斯开发的一款高性能的HTTP和反向代理服务器,因其高效稳定、内存消耗小、并发能力...通过本课程的学习,你将能够全面了解Nginx,掌握其基本配置和应用场景,为构建高效稳定的Web服务环境打下坚实基础。

    PriorityQueue带优先级的队列md,学习代码笔记

    **PriorityQueue带优先级的队列** `PriorityQueue`是Java集合框架...理解这些技术并合理选择使用,对于构建高性能、安全的Web应用至关重要。在实际开发中,需要根据应用场景和需求来决定使用哪种机制来管理用户状态。

    ngotes:使用MongoDB的笔记站点

    MongoDB是一款高性能、开源、无模式的文档型数据库,被广泛应用于Web开发中,尤其是对于处理JSON、BSON格式数据的应用场景。Ngotes是一个基于MongoDB构建的笔记站点,它利用了MongoDB的强大功能来存储和检索用户的...

    JavaScript_使用 NextJS Notion API 实现的支持多种部署方案的静态博客无需服务器零门槛搭建网站为

    它简化了React应用的开发流程,提供了诸如自动代码分割、预渲染、路由、热模块替换等特性,让开发者可以快速地构建可扩展的、高性能的Web应用。 **Notion API** Notion是一款强大的笔记和项目管理工具,它的API...

    基于PHP的minIsay php笔记程序beta.zip

    1. **轻量级架构**:minIsay的设计理念是简洁,因此其代码结构清晰,资源占用少,对于小型和个人站点而言,运行效率高,且易于部署和维护。 2. **PHP技术栈**:作为一款PHP程序,minIsay充分利用了PHP的灵活性和...

    Django_Learning:一个讲述我的Django学习笔记和项目的资料库

    这个名为"Django_Learning"的资料库,显然是一位学习者记录自己在探索Django框架过程中的笔记和项目实践。在这个资料库中,你可以期待找到一系列关于Django的教程、代码示例、项目实践以及可能的问题解决方案。 ...

    documentation::open_file_folder:我用盖茨比制成的个人笔记本

    首先,Gatsby是一款基于React的静态站点生成器,它结合了现代Web开发的最佳实践,如JAMstack(JavaScript、APIs、Markup),为构建高性能的网站提供了一流的解决方案。通过Gatsby,我们可以快速搭建起个人笔记本的...

    Foundation框架v6.5.1

    总的来说,Foundation框架v6.5.1是一个强大且全面的工具,适用于希望快速构建高性能、响应式Web应用的开发者。通过理解和利用其核心特性,开发者可以大大提高工作效率,同时创造出用户体验优秀的Web产品。

    notebook:每日笔记本迷你博客

    1. **Gatsby**:Gatsby是一个基于React的开源静态站点生成器,用于快速构建现代Web应用。Gatsby以其出色的性能、丰富的插件生态系统和SEO优化而闻名。在“notebook”项目中,Gatsby被用来构建响应式的博客界面,能够...

Global site tag (gtag.js) - Google Analytics