加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 站长资讯 > 评论 > 正文

加快自动驾驶技术应用

发布时间:2021-02-06 14:39:13 所属栏目:评论 来源:互联网
导读:用户空间:除了用户自己的APP之外,也隐含了所有的库,例如常见的C库。我们常用的IO函数,例如open()/read()/write()是系统调用,由内核直接提供功能实现,而fopen()/fread()/fwrite()则是C库实现的函数,通过封装系统调用实现更高级的功能。 虚拟文件系统:
  1. 用户空间:除了用户自己的APP之外,也隐含了所有的库,例如常见的C库。我们常用的IO函数,例如open()/read()/write()是系统调用,由内核直接提供功能实现,而fopen()/fread()/fwrite()则是C库实现的函数,通过封装系统调用实现更高级的功能。
  2. 虚拟文件系统:屏蔽具体文件系统的差异,向用户空间提供统一的入口。具体的文件系统通过register_filesystem()向虚拟文件系统注册挂载钩子,在用户挂载具体的文件系统时,通过回调挂载钩子实现文件系统的初始化。虚拟文件系统提供了inode来记录文件的元数据,dentry记录了目录项。对用户空间,虚拟文件系统注册了系统调用,例如SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)注册了open()的系统调用。
  3. 具体的文件系统:文件系统要实现存储空间的管理,换句话说,其规划了哪些空间存储了哪些文件的数据,就像一个个收纳盒,A文件保存在这个块,B文件则放在哪个块。不同的管理策略以及其提供的不同功能,造就了各式各样的文件系统。除了类似于vfat、ext4、btrfs等常见的块设备文件系统之外,还有sysfs、procfs、pstorefs、tempfs等构建在内存上的文件系统,也有yaffs,ubifs等构建在Flash上的文件系统。
  4. 页缓存:可以简单理解为一片存储着磁盘数据的内存,不过其内部是以页为管理单元,常见的页大小是4K。这片内存的大小不是固定的,每有一笔新的数据,则申请一个新的内存页。由于内存的性能远大于磁盘,为了提高IO性能,我们就可以把IO数据缓存在内存,这样就可以在内存中获取要的数据,不需要经过磁盘读写的漫长的等待。申请内存来缓存数据简单,如何管理所有的页缓存以及如何及时回收缓存页才是精髓。
  5. 通用块层:通用块层也可以细分为bio层和request层。页缓存以页为管理单位,而bio则记录了磁盘块与页之间的关系,一个磁盘块可以关联到多个不同的内存页中,通过submit_bio()提交bio到request层。一个request可以理解为多个bio的集合,把多个地址连续的bio合并成一个request。多个request经过IO调度算法的合并和排序,有序地往下层提交IO请求。
  6. 设备驱动与块设备:不同块设备有不同的使用协议,而特定的设备驱动则是实现了特定设备需要的协议以正常驱使设备。对块设备而言,块设备驱动需要把request解析成一个个设备操作指令,在协议的规范下与块设备通信来交换数据。

形象点来说,发起一次IO读请求的过程是怎么样的呢?

用户空间通过虚拟文件系统提供的统一的IO系统调用,从用户态切到内核态。虚拟文件系统通过调用具体文件系统注册的回调,把需求传递到具体的文件系统中。紧接着具体的文件系统根据自己的管理逻辑,换算到具体的磁盘块地址,从页缓存寻找块设备的缓存数据。读操作一般是同步的,如果在页缓存没有缓存数据,则向通用块层发起一次磁盘读。通用块层合并和排序所有进程产生的的IO请求,经过设备驱动从块设备读取真正的数据。最后是逐层返回。读取的数据既拷贝到用户空间的buffer中,也会在页缓存中保留一份副本,以便下次快速访问。

如果 页缓存没命中,同步都会一路通到 块设备,而对于 异步写,则是把数据放到 页缓存后返回,由内核回刷进程在合适时候回刷到 块设备。

根据这个流程,考虑到我没要到KVM host的权限,我只能着手从Guest端的IO栈做优化,具体包括以下几个方面:

  1. 交换分区(swap)
  2. 文件系统(ext4)
  3. 页缓存(Page Cache)
  4. Request层(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数据库的对比

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读