编译tensorflow-serving GPU

背景 因为业务方上了bert的模型,所以要制作一个GPU版本的sidecar的TFServing镜像。 编译 找到一种可以直接通过docker编译,不用在主机上装各种东西的方法:使用devel版本的镜像。 devel镜像 TFServing-devel版本的镜像自带了很多编译Tensorflow Serving的组件,比如bazel、gcc、glibc等等等等,因此会非常大。打好镜像后我们把bin文件拷贝到非devel版本的镜像里面运行即可。 去dockerhub拉镜像:https://hub.docker.com/ ...

插件化框架

因为在写一个多租户可用的框架,希望在上线的时候各个租户能够尽量做到互不影响,所以写了一个插件化加载的方法。中间踩了不少坑,写篇文章记一下。 1 获取ClassLoader 1.1 上游获取ClassLoader /** * 反射设置addUrl为可达 * @return */ private static Method initAddMethod(){ try{ Method add = URLClassLoader. ...

redis缓存

缓存的三种问题 缓存穿透:大批量请求不存在的key,导致数据库压力增大。【解决方案】:布隆过滤器。 缓存击穿:同一时间大批量请求一个过期的key,导致这些请求在同一时间访问数据库。【解决方案】:获取数据库后回写这个过程申请分布式锁,只有一个请求能获取后回写,其他一直重试等待。 缓存雪崩:同一时间大批量key过期。【解决方案】:设置expire time的时候随机加1~5分钟的超时。 数据库和缓存一致性解决: ...

buffer和cache的区别

linux:buffer是缓存裸设备的读写,cache是缓存文件系统的读写。 应用系统:buffer主要为了解决CPU和其他存储设备之间速度不对等的问题,比如编辑编写错误的时候使用。定期会刷新; cache主要用于在内存中缓存原本需要从磁盘读取的数据。 refer:http://www.differencebetween.net/technology/hardware-technology/difference-between-cache-and-buffer/ ...

单例的几种实现方式

饿汉模式 public class Singleton { private static Singleton instance = new Singleton(); private Singleton(){}; public Singleton getInstance(){ return instance; } } 懒汉模式 public class ...

ThreadLocal内存泄漏问题

上一篇做了个实验,不正确的使用ThreadLocal可能会导致内存泄漏,这一篇就来讲一下为什么ThreadLocal会导致内存泄漏。 ThreadLocal实现原理 ThreadLocal的核心是一个ThreadLocalMap,ThreadLocalMap中保存了一个Entry数组,Entry继承了ThreadLocal的弱引用:ThreadLocalMap中元素的key为当前ThreadLocal对象,而value对应线程的变量副本,每个线程可能存在多个ThreadLocal。 static class Entry extends WeakReference<ThreadLocal<?>> ...

JVM排查问题

挑个趁手的好工具 mac中安装MAT,不需要先装Eclipse,可以直接安装MAT。 下载 https://www.eclipse.org/mat/downloads.php 启动 下载完成后解压,到目录mat.app/Contents/MacOS 下启动 ./MemoryAnalyzer ...

java一些参数

CPU消耗过高会引起上下文切换的增加,但并不代表这个就不正常了。正常情况下上下文切换在几百到几千,高峰时段会上升至几万,甚至几十万。 GC在核心业务应用服务中越久发生越合适,且GC的时间不要太长。一般生产环境的FGC几天一次是比较正常的。 单核CPU的线程安全问题:线程安全除了要保证可见性,还需要保证原子性、有序性。 ...

kafka UT

@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) public class KafkaTest { @Autowired private WebApplicationContext wac; @Autowired KafkaTemplate<String, String& ...

Redis分布式锁

todo: https://learnku.com/articles/4211/unlock-the-correct-position-of-the-redis-lock https://juejin.im/post/5cc165816fb9a03202221dd5 https://crossoverjie.top/2018/03/29/distributed-lock/distributed-lock-redis/ ...

MAC下使用GDB调试redis

因为在看redis源码,调试的时候一直出问题,所以记录一下踩过的坑。 权限不足,或者启动后卡住 提示: Unable to find Mach task port for process-id 43536: (os/kern) failure (0x5). (please ...

volatile内存模型

Java中的volatile CPU的读写操作 CPU在cache line状态的转化期间是阻塞的,经过长时间的优化,在寄存器和L1缓存之间添加了LoadBuffer、StoreBuffer来降低阻塞时间,LoadBuffer、StoreBuffer,合称排序缓冲(Memoryordering Buffers (MOB)),Load缓冲64长度,store缓冲36长度,Buffer与L1进行数据传输时,CPU无须等待。 CPU执行load读数据时,把读请求放到LoadBuffer,这样就不用等待其它CPU响应, ...

MAC下使用HSDIS生成汇编代码并使用JITWatch查看

jdk 安装jdk8 笔者之前使用的java12版本愣是不能使用HSdis和JITWatch,于是就安装了JDK8。 前往Oracle官网下载jdk8: https://www.oracle.com/java/technologies/javase-jdk8-downloads.html 多版本管理 试了一下使用jenv不能用,还是老实export JAVA_HOME参数。 环境变量配置 /usr/ ...

动态创建FeignClient

之前在项目里面都是指定一个interface做FeignClient,带上FeignClient的注解,这样子每一个微服务都需要有个interface。在做中台项目的时候需要通过配置化来创建FeignClient,就想到怎么手动去创建FeignClient。一番操作猛如虎后,写个memo以防自己以后忘记了。 创建eureka服务 在 https://start.spring.io/ 中勾选Eureka Server,下载下来后: 代码:Application类上加注解 @EnableEurekaServer 配置文件: ...

MAC编译openjdk

配置mac环境:brew install freetype ccache,安装xcode,gcc和make都需要 代码推荐https://hg.openjdk.java.net/jdk/jdk12/ 去获取zip包(点击browse->zip) 下载解压后 chmod ...

JVM字节码调用指令

invokestatic:用于调用静态方法。 invokespecial:用于调用私有实例方法、构造器,以及使用 super 关键字调用父类的实例方法或构造器,和所实现接口的默认方法。 invokevirtual:用于调用非私有实例方法。 invokeinterface:用于调用接口方法。 invokedynamic:用于调用动态方法。 ...

任务调度系统调研

因为需要用到java系的调度系统,所以最近在调研。 国内的主要有xxl-job、saturn、quartz和sia-task,因为quartz有数据库锁的问题,saturn没有说明是否可以做任务依赖,所以初步选择xxl-job和sia-task。 xxl-job github: https://github.com/xuxueli/xxl-job/ xxl-job部署非常方便,起mysql、起调度中心和执行器即可: 部署 mysql ...

TF-Serving源码分析—模型加载部分

背景 因为要加一个检测模型加载是否成功的接口,需要读取TF-Serving中保存的加载到内存的model_config_file。 一开始在ServerCore里面加一个函数getConfig(),加锁访问该类中的config_,该变量保存了模型配置。 Status ServerCore::getConfig(std::unordered_map<string, string>* config_map) ...

GUARDED_BY —— clang的线程安全分析模块 thread safety analysis

通过代码注解(annotations )告诉编译器哪些成员变量和成员函数是受哪个 mutex 保护,这样如果忘记了加锁,编译器会给警告。因为在后续维护别人的代码时候,往往不像原作者那样深刻理解设计意图,特别容易遗漏线程安全的假设。 Thread Safety Annotations 可以方便阅读代码,而且在编译的时候会检查锁的状态。 其工作原理非常类似于多线程程序的类型系统。除了声明数据类型之外,还可以声明在多线程环境中如何控制对该数据的访问。比如如果foo遍历被互斥锁mu保护,那么只要有一段代码在没有先锁定mu的情况下读取或写入foo, ...

const在变量前后的含义

const int * p1=&me;//p1可变,p1不可变,此时不能用p1来修改,但是p1可以转向 int * const p2=&me;//p2不可变,p2可变,此时允许p2来修改其值,但是p2不能转向。 const int ...

C++的std::optional

解决函数多个返回值 为了解决C++函数返回多个值的问题,以前的做法通常是把返回指的指针作为入参传入,用函数的返回值作为运行状态的标识,比如下面这段,把指针output传入: #include <iostream> using namespace std; int func(const string& str, ...

JVM内存 — 《java核心技术》

JVM内存区域划分 程序计数器,每个线程都有自己的程序计数器,存储当前线程正在执行的Java方法的JVM指令地址; Java虚拟机栈,每个线程在创建时都会创建一个虚拟机栈,内部保存一个个栈帧,对应着一次次方法调用。如果在该方法中调用了其他方法,则会创建新的栈帧。栈帧中存储着局部变量表、操作数栈、动态链接、方法正常退出或异常退出的定义等; 堆,放置Java对象实例,是垃圾收集器重点照顾的区域; 方法区,所有线程共享的一块内存区域,用于存储元数据, ...

Spring sidecar模式纳入TF-Serving(二):mac上编译TF-Serving

前言 因为卤煮的云主机只有1G的内存,blade编译的时候一直OOM,所以只能在自己的mac上编译。 blade和TF-Serving版本、gcc版本之间都需要匹配,特别是bazel和TF-Serving之间匹配,不然经常因为各种原因装不上,这里列一下清单: 名称 版本 下载地址 TF-Serving r1.15 https://github.com/tensorflow/serving ...

Java的类加载过程 - 《Java核心技术》

Java类加载步骤 加载:将字节码数据从不同的数据源读取到JVM中,并映射为JVM认可的数据结构; 链接:把原始类定义信息平滑的转化入JVM,包括: 验证:验证字节信息是符合Java虚拟机规范的。 准备:创建类或接口中的静态变量,并初始化静态变量的初始值。 解析:将常量池中的符号引用替换为直接引用。 初始化:真正执行类初始化的代码逻辑,包括静态字段赋值、执行类定义中的静态初始化块内的逻辑。 双亲委派模型 简单来说就是当类加载器试图加载某个类型的时候, ...