服务性能过低?

关于性能是很多新手程序员最关心的话题.
然而性能是最不重要的, 直到有性能问题.
决定一个服务的性能, 最关键是架构和算法.
合适的架构, 把费时的操作放在 异步的 Job 中, 或者以 P2P 的方式化解, 或者用客户端的计算能力;
合适的算法, 以 O(1) 替代 O(N), 或者以直接用 GPU 来计算;
这都是很好的办法.
如果这些都不没有解决问题, 那么围观的方法才应该被考虑.
下面我们来看一幅图:
media20160803jpg
现代的 CPU 已经非常复杂, 关于性能需要记住的几点是:

  • 内存操作很慢, 最好是不要用间接方式操作数据 (例如 map[string]*struct xxx), 直接复制小结构体会更好.
  • 系统调用非常非常慢, 而且 CPU 核心越多系统调用越慢. 一次系统调用往往会导致 TLB 命中率暴降, 当前 Core 的 L1 Cache 完全被刷新.
  • SSD 有时候比系统调用快.
  • 网络 IO 很慢, 进程内的缓存远快于远程缓存.
  • 缓存一致性协议非常非常重要. 在多个线程间不合适的共享一个结构体会导致灾难性的性能下降. 例如用一个 Go 的 chan 在 100 个 goroutine 间共享, 并高频率的读写. 这会导致缓存一致性协议频繁的刷新不同 Core 的不同级别的 Cache, 性能会非常低.
  • 原子操作在 CPU 核心很多 (>60) 且高冲突的情况下, 并不快.
  • 线程切换非常非常的慢. 一次线程切换往往会导致缓存的命中率暴降.