Transcript volatile
Armed Bandits、Machine Learning
和 Fast Java:实时 API 的实用建议
Breandan Considine
OneSpot, Inc.
为何要实时?
●
现实世界充满了各种各样棘手 的问题
●
实时应用程序的类型
强实时(核反应堆控制)
准实时(拍卖竞价)
弱实时(列车调度)
●
实时处理具有优势
●
现实世界中的应用
●
性能的可扩展性
实时处理的优势
●
●
●
迫使我们缩小优先级的范围
关注持久的稳定解决方案,而不是随时间变化的精
确解
大量数据,但处理能力有限
可操作数据的生命周期非常短暂
权衡最优性和吞吐量
●
随时间推移将实现速度和并行化
●
具有长期收益的先期投资
实时交互式任务 (RIT)
●
在线拍卖:DSP、SSP
●
多元测试
●
库存管理、SCM
●
调度、导航、路由
●
推荐系统
●
高频交易
●
预防诈骗
通用思路
●
代理提供上下文和选择集
●
每种选择都有一个未知的收益分配
●
选择一个选项,衡量结果
●
目标:累积收益最大化
多个实例
时间敏感
重要特性
挑战
●
测试上下文中的每个操作是不切实际的
要考虑计算的难度
充分调查的成本大于效益
●
探索-利用的权衡
次优选择的机会成本
局部极值掩盖最优解
●
延迟时间以吞吐量为代价
必须计算每个时钟周期
严格的实时特征
传统式监督学习周期
强化学习 (RL)
利与弊
●
从头开始,训练是昂贵的
●
信用分配问题和报酬结构
●
非静态系统的问题:
●
持续集成反馈
●
适用于实时决策
●
无数据假设
●
遵循信号联机
●
类似于我们的学习方式
非阻塞算法
●
高性能 I/O 的关键
●
相对难以正确实现
●
对基于锁的变体提供较大加速
●
非阻塞保证的类型
无等待
无锁
无阻塞
无锁
●
保证至少有一个线程能够继续往下执行
●
不保证无饥饿
●
总体可能较慢,请参见阿姆达尔定律
Java 内存模型
●
happens-before 关系
线程操作遵循partial order
确保 JVM 不会随意重新排序操作
●
●
对没有数据竞争的程序,可保证顺序一致性
除非明确声明,否则无法避免线程对操作具有不
同的可见性
volatile 关键字
●
两个简单规则控制的机制
线程内的每个操作均以程序中的顺序进行
volatile变量的写操作发生在后续对该字段的读操
作之前
●
●
读写直接操作主存
对于读取锁定、写入解锁的语法简写会引发类似
的性能影响
Java 并发性
●
ConcurrentHashMap、ConcurrentLinkedQueue
●
需要进行仔细的基准测试
根据具体实现,速度可能会极慢
避免使用默认的HashMap构造函数
存在更快的实现,无锁
Java 8 在管道方面有改进
●
容易违反原子性
ConcurrentHashMap<String, Data>
map;
Data updateAndGet(String key) {
Data d = map.get(key);
if(d == null) { // Atomic
violation
d = new Data();
map.put(key, d);
}
return d;
Java 原子性
●
保证无锁的线程安全性
●
使用 CAS 原语确保原子操作
●
在轻度到中度争用情况下,比 volatile具有更
好的性能,必须在生产环境中进行测试
private T current;
public synchronized <T> T
compareAndSet(T expected, T new) {
T previous = current;
if(current == expected)
current = new;
return previous;
}
ABA 问题
●
●
●
直接检查值相等是不够的
在执行CAS原语之前,完整的 A-B-A 事务可能
刚执行完, 这会导致结构变化时的意外等同
解决方案:只要值发生变化,就生成一个唯一的
标签, CAS针对值-标签对进行操作
伪共享
●
可通过填充字段来防止
●
Java 8 用 @Contended 解决了这个问题
多臂赌博机问题
●
N 个选择,每种选择都有未知的收益分配
●
什么样的策略可以使累积收益最大化?
●
观察报告:从表示观测概率的分配中随机选择,
返回 ARGMAX
Bayesian Bandits
*http://camdp.com/blogs/multi-armed-bandits
自适应控制问题
●
实时处理的参数估计
●
采用连续的反馈来调整输出
起搏技术
PID 控制器
计数/过滤问题
●
大型域输入(IP、电子邮件、字符串)
●
需要在线维护、流传输聚合
●
查看 Hadoop 库了解最佳实现
●
观察报告:快速哈希是关键
布隆过滤器
●
快速概率性成员测试
●
保证没有漏报,空间开销低
特别感谢
Ian Clarke
Matt Cohen
参考
http://mechanical-sympathy.blogspot.ie/
http://camdp.com/blogs/multi-armed-bandits
http://blog.locut.us/2011/09/22/proportionate-ab-testing
http://blog.locut.us/2008/01/12/a-decent-stand-alonejava-bloom-filter-implementation/
http://www.cl.cam.ac.uk/research/srg/netos/lock-free/
https://github.com/edwardw/high-scale-java-lib
M. Michael, et al.简单、快速、实用的非阻塞和阻塞并发
队列算法。 [PDF]
P. Tsigas 等针对实时 Java 规范的无等待队列算法。
[PDF]