一.Linux中常用的监控CPU整体性能的工具有:
§ mpstat: mpstat 不但能查看所有CPU的平均信息,还能查看指定CPU的信息。
mpstat [-P {|ALL}] [internal [count]] -P {|ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值
§ vmstat:只能查看所有CPU的平均信息;查看cpu队列信息;
vmstat和sar类似也可指定采样周期和采样数量
§ iostat: 只能查看所有CPU的平均信息,快速定位系统是否产生大量I/O操作
§ sar: 与mpstat 一样,不但能查看CPU的平均信息,还能查看指定CPU的信息。
sar [-u,-r,-b] [<interval> <count>] -u cpu利用率,-r内存利用率,-b I/O利用率,interval表示采样周期,count表示采样数量
§ top:显示的信息同ps接近,但是top可以了解到CPU消耗,可以根据用户指定的时间来更新显示。
pidstat linux性能检测工具
在Debian/Ubuntu系统中可以使用下面的命令来安装
# apt-get install sysstat
CentOS/Fedora/RHEL版本的linux中则使用下面的命令:
# yum install sysstat
二.RPC和Http的区别:
目前有很多Java的RPC框架,有基于Json的,有基于XML,也有基于二进制对象的。
论复杂度,RPC框架肯定是高于简单的HTTP接口的。但毋庸置疑,HTTP接口由于受限于HTTP协议,需要带HTTP请求头,导致传输起来效率或者说安全性不如RPC。
现在问题是,遇到怎样的瓶颈了才需要或者说更适合用RPC(比如像阿里这么大的请求并发量,简单的HTTP肯定达不到预期),但问题是大家所在的公司,要有像阿里这么大的量是比较少的,甚至说1/1000的量可能都没有,那我们还需要使用RPC吗?
技术应该不是为了使用新技术而去使用,而应该是旧技术存在某些瓶颈,存在难以支撑或者扩展性越老越差等问题暴露出来之后,用新技术来进行解决。
http接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的http协议进行传输。但是如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。第三个来说就是安全性。最后就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑
三.NIO的理解
3.1NIO和BIO的区别和各自适用的场景
区别:
BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要
的线程开销,当然可以通过线程池机制改善。
NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程
进行处理。
各自应用场景:
NIO适合处理连接数目特别多,但是连接比较短(轻操作)的场景,Jetty,Mina,ZooKeeper等都是基于java nio实现。
BIO方式适用于连接数目比较小且固定的场景,这种方式对服务器资源要求比较高,并发局限于应用中。
3.2给我们带来了些什么
事件驱动模型
避免多线程
单线程处理多任务
非阻塞I/O,I/O读写不再阻塞,而是返回0
基于block的传输,通常比基于流的传输更高效
更高级的IO函数,zero-copyIO多路复用大大提高了Java网络应用的可伸缩性和实用性
NIO一个重要的特点是:socket主要的读、写、注册和接收函数,在等待就绪阶段都是同步非阻塞的,真正的I/O操作是同步阻塞的(消耗CPU但性能非常高)。
解释的比较清楚的文章:
http://tech.meituan.com/nio.html?utm_source=tuicool&utm_medium=referral
四常用的集合
ArrayList的内部实现是基于基础的对象数组的,因此,它使用get方法访问列表中的任意一个元素时(random-access),它的速度要比LinkedList快
LinkedList基于链表的数据结构,没有同步办法。若是多个线程同时接见一个List,则必须本身实现接见同步。一种解决办法是在创建List机会关一个同步的List:
List list = Collections.synchronizedList(new LinkedList(...));
Vector是同步的。由Vector创建的Iterator,固然和ArrayList创建的Iterator是同一接口,然则,因为Vector是同步的,当一个Iterator被创建并且正在被应用,另一个线程改变了Vector的状况(例如,添加或删除了一些元素),这时调用Iterator的办法时将抛出ConcurrentModificationException,是以必须捕获该异常。
总结特点如下:
类型 | 内部结构 | 顺序遍历速度 | 随机遍历速度 | 追加代价 | 插入代价 | 删除代价 | 占用内存 |
ArrayList | 数组 | 高 | 高 | 中 | 高 | 高 | 低 |
LinkedList | 双向链表 | 高 | 低 | 低 | 低 | 低 | 中 |
所以:
- 一般顺序遍历情况下使用ArrayList,但注意构造函数中设置初始大小
- 尽量不对ArrayList进行插入或删除操作(删除尾部除外),若有多次删除/插入操作又有随机遍历的需求,可以再构建一个ArrayList,把复合条件的对象放入新ArrayList,而不要频繁操作原ArrayList
- 经常有删除/插入操作而顺序遍历列表的情况下最适合使用LinkedList
五锁
只在REPEATABLE READ或以上的隔离级别下的特定操作才会取得gap lock或nextkey lock。