加快自动驾驶技术应用
形象点来说,发起一次IO读请求的过程是怎么样的呢? 用户空间通过虚拟文件系统提供的统一的IO系统调用,从用户态切到内核态。虚拟文件系统通过调用具体文件系统注册的回调,把需求传递到具体的文件系统中。紧接着具体的文件系统根据自己的管理逻辑,换算到具体的磁盘块地址,从页缓存寻找块设备的缓存数据。读操作一般是同步的,如果在页缓存没有缓存数据,则向通用块层发起一次磁盘读。通用块层合并和排序所有进程产生的的IO请求,经过设备驱动从块设备读取真正的数据。最后是逐层返回。读取的数据既拷贝到用户空间的buffer中,也会在页缓存中保留一份副本,以便下次快速访问。 如果 页缓存没命中,同步都会一路通到 块设备,而对于 异步写,则是把数据放到 页缓存后返回,由内核回刷进程在合适时候回刷到 块设备。 根据这个流程,考虑到我没要到KVM host的权限,我只能着手从Guest端的IO栈做优化,具体包括以下几个方面:
由于源码以及编译的临时文件都不大但数量极其多,对随机IO的要求非常高。要提高随机IO的性能,在不改变硬件的情况下,需要缓存更多数据,以实现合并更多的IO请求。 咨询ITer得知,服务器都有备用电源,能确保不会掉电停机。出于这样的情况,我们可以尽可能优化速度,而不用担心掉电导致数据丢失问题。 总的来说,优化的核心思路是尽可能多的使用内存缓存数据,尽可能减小不必要的开销,例如文件系统为了保证数据一致性使用日志造成的开销。 交换分区 交换分区的存在,可以让内核在内存压力大时,把内核认为一些不常用的内存置换到交换分区,以此腾出更多的内存给系统。在物理内存容量不足且运行吃内存的应用时,交换分区的作用效果是非常明显的。
然而本次优化的服务器反而不应该使用交换分区。为什么呢?服务器总内存达到47G,且服务器除了Jenkins slave进程外没有大量吃内存的进程。从内存的使用情况来看,绝大部分内存都是被cache/buffer占用,是可丢弃的文件缓存,因此内存是充足的,不需要通过交换分区扩大虚拟内存。 PostgreSQL数据库中还有一些支持移动互联网的新功能,如空间索引。PostGIS是最著名的一个开源GIS系统,它是PostgreSQL中的一个插件,在PostgreSQL中使用它很方便。通过PostGIS也可以很方便地解决LBS中的一些位置计算问题。 综上所述,PostgreSQL数据库是一个功能强大,又带有移动互联网特征的开源数据库。 如果你仅仅是想把数据库作为一个简单的存储软件(一些大的互联网公司就是这样),一些较复杂的功能都想放在应用中来实现,那么选择MySQL或一些NoSQL产品都是合适的。如果你应用的数据访问很简单(如大多数的博客系统),那么后端使用MySQL也是很合适的。 但是如果你的应用不像博客系统那么简单,又不想消耗太多的开发资源,那么PostgreSQL是一个很明智的选择。最有说服力的例子就是图片分享公司instagram,在使用“Python+PostgreSQL”架构后,只是十几个人就支撑了整个公司的业务。 在数据库中使用PostgreSQL的感觉就像在开发语言中使用Python,会让你的工作变得简洁和高效。
2. PostgreSQL与Oracle数据库的对比 (编辑:济源站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |