1. 系统的人类用户天生就具备进行创造性破坏的本事
1.1. 用户会消耗内存
1.2. 用户会做奇怪和随机的事情
1.2.1. fuzzing工具箱、基于属性的测试或模拟测试
1.3. 恶意用户总是存在的
1.3.1. 灾祸总会发生,坏人肯定存在
1.4. 用户会合伙对付你
2. 难伺候的用户
2.1. 通常就是想挣这些挑剔用户兜里的钱
2.2. 提高用户转化率或许能让公司的损益表更好看些,但这确实给系统增加了实现难度
2.3. 最好针对这些难伺候的用户积极地进行测试
2.3.1. 确定系统开销最大的事务,然后将这些事务的份额增加1~3倍
2.3.2. 系统平时承受的平均压力,肯定会小于上述负载测试产生的压力
2.3.3. 单单构建系统并处理系统最昂贵的事务这一件事,就会在硬件上多花费10倍的成本
3. 不受欢迎的用户
3.1. cookie是一种明智的选择
3.1.1. 未加密的cookie数据可能会被恶意顾客操纵
3.1.2. 安全性要求cookie不能包含实际数据,否则就必须加密
3.1.3. cookie开始用于小块数据,只能用持久cookie标记用户,或用临时cookie识别会话
3.2. 恶意用户
3.2.1. 真正有“才华”的黑客
3.2.1.1. 高级持久威胁
3.2.2. 脚本小子
3.2.2.1. 数量庞大而非常危险
4. 容量
4.1. 是指在给定工作负载下,系统既能保持提供可接受的性能,又能承受得住的最大吞吐量
4.2. 不断增长的用户流量最终将超过系统的容量
4.3. 裂纹在压力的作用下总是会蔓延得更快
5. 堆内存
5.1. 放入会话的每个对象都位于内存中,占用着能为其他用户提供服务的宝贵字节
5.1.1. 最好尽可能少地保留内存中的会话
5.1.2. 对于放入会话的每一份数据,都要考虑它是否可能永远不会再使用
5.1.3. 这些数据可能在接下来的30分钟里白白地占用内存,并使系统面临危险
5.2. 如果情况非常糟糕,日志系统甚至可能无法记录错误
5.3. 如果系统没有创建日志事件的内存,则不会记录任何内容
5.4. 存在这种可能,所以除了日志文件抓取之外,应该还需要做外部监控
5.5. 弱引用
5.5.1. 能够在内存富裕时保存会话内容(也就是在内存中),在内存紧张时自动节约内存
5.5.2. 垃圾收集器需要回收内存之前,弱引用都可以持有另一个对象,后者称为前者的有效载荷
5.5.2.1. 当该对象的引用只剩下软引用时,则软引用就可以被回收
5.5.2.2. 在创建弱引用对象时,可以将大型或昂贵的对象作为其有效载荷
5.5.2.3. 垃圾回收对象都是有效载荷,而不是弱引用本身
5.5.3. C#中叫System.WeakReference
5.5.4. Java中叫java.lang.ref.SoftReference
5.5.5. Python中叫weakref
5.5.6. 当内存不足时,垃圾收集器可以回收任何弱可达对象
5.5.7. 弱引用是应对不断变化的内存环境的有用方式,但也确实增加了复杂性
6. 堆外内存和主机外内存
6.1. 将内存分配给不同的进程
6.1.1. 不要将它放在堆内,即不要放在服务器进程的地址空间内,而是将其移交给其他进程
6.2. Memcached就是使用这种方法的一个很好的工具,它本质上是一个内存中的键-值存储,可以将其放在不同的机器上,也可以将其散布在多台机器上
6.3. Redis是将内存移出进程的另一个流行工具。它是一种快速的“数据结构服务器”,其定位介乎缓存和数据库之间
6.4. 在可寻址的内存空间和内存访问延迟之间进行权衡
6.5. 存储器层次根据大小和距离排列,寄存器是最快和最接近CPU的,其次是缓存,然后是局部存储器、磁盘、磁带等
6.6. 网络变得相当快——访问“别人内存”的速度快于访问本地磁盘的速度
6.6.1. 应用程序最好通过远程调用获取一个值,而不是从存储中读取值
6.6.2. 局部存储器仍然比远程存储器更快
6.6.3. 一对矛盾
7. 服务器上的套接字
7.1. 查看TCP数据包的格式,就能看到端口号长16位,这表示端口号最大只能到65535
7.2. 互联网数字分配机构的建议范围是49152~65535
7.2.1. 服务器最多可以打开16383个连接
7.2.2. 可以将端口范围扩展为1024~65535
7.2.2.1. 最多可以有64511个连接
7.3. 虚拟IP地址
7.3.1. 操作系统将多个IP地址绑定到同一个网络接口
7.3.2. 每个IP地址都有自己的端口号范围
7.3.3. 要处理上百万个连接,总共只需要16个IP地址
7.3.3.1. 需要很多内核缓冲区
7.4. 已经关闭的套接字
7.4.1. 在应用程序代码关闭一个套接字后,TCP协议栈会多次改变其终结状态
7.4.2. TIME_WAIT
7.4.2.1. 可以调小TIME_WAIT间隔,尽快恢复使用这些端口
7.4.3. bogon是指游荡的数据包
7.4.3.1. 互联网上的bogon是一个真实但影响较小的问题