1、分布式系统中高性能问题及难点(单一节点能力最高)
- 内存和并发编程领域的难题;
- 网络通信;
- 事件编程;
2、内存和并发编程领域的难题
- Java建立线程与CPU之间的映射及Heap与内存之间的透明化;
- Java无法直接操作物理内存,目前可以DirectByteBuffer(可在堆外分配内存,可以跳过GC,但是内存释放有一些问题,移动过程中存在内存复制及CPU消耗(序列化与反序列化数组));
- JEP(Java堆外内存),将已经定义外某些域(局部)中的变量(不会溢出)时可以分配在栈上而不是堆上,堆外放对象;
- 内存存储通用难题
-
- 内存使用效率问题;
- 内存不足时磁盘溢出问题,透明访问;
- 内存回收的问题;
- CPU方面的问题
-
- NUMA是内存共享设计下的一个难点;
- 缓存友好的数据结构
-
- 实现CPU的一次加载
- 边界对齐;
- 数据结构预算法;
- 使用小类型;
- 区分冷热数据;
- 空间上连续分布;
- Spark在缓存计算上进行了很多优化,在CPU的L1、L2、L3的缓存上进行设计;
- 二分检索是查找有序数组的最简单并且最有效的算法之一,然而二分检索的随机跳跃性,导致算法并非缓存友好;
- CATree基于B-数结构,降低查找算法及访问次数;HAT-trie是一个Cache敏感的字符串存储方法
- “之前的算法都是基于单核,现在走入多核时代需要改进一些算法以适应多核”
- GPU并行编程
-
- CUDA编程,进行Java中逻辑的变化;
3、网络编程
- Netty是否是性能最好的NIO?
- CoraReactor网络交互工具(比Netty速度快很多,2μs);
- Netty在进行select的时候产生大量垃圾;
- OpenOnload高性能网络栈
4、高性能事件派发机制探讨
- 线程切换的代价;
- 时间片用完后,系统CPU正常调度下一个任务;
- 当任务遇到IO阻塞,调度器将挂起此任务,继续下移任务;
- 多任务抢占锁资源,当前任务没抢到,挂起;
- 用户挂起让出CPU时间
- 终端。硬件终端,外设发送电信号
- 尽量避免线程频繁切换
- Disruptor(高性能派发):RingBuffer(每个元素都有一个序列号):Cache编程、无锁编程,事件处理;
5、高性能的问题
- 新硬件、数据规模、实时性带来挑战:新的数据结构及新的算法;
- 分布式和云计算发展带来的挑战:网络性能及编程模型的改进;