花呗真是坑爹呢这是,别人给我转了8700元竟扣了我52.2元手续费,怎么收那么多呢

  现在的数码相机越来越多地滲透到我们生活当中不少人还随身携带数码相机以记录生活点滴。但对于相机的清洁保养并不是每个人都精通,所以我们经常看见残舊不堪或者脏兮兮的相机不但有碍观瞻,而且还会对照片质量产生影响今天就让我们从视频当中学习一下相机清洁保养的技巧吧。

CCD、CMOS影像传感器清洁保养

  明明是纯净的蓝天白云好天气拍出的相片上怎么出现了不明的小黑点?这时就是该清洁影像传感器了!拆装镜頭时容易导致入尘多数人会送到原厂做清洁服务,然而对于出国或远行的网友发生入尘的状况时就得要自己动手先行处理了。

  本站特别制作单反相机的清洁保养专辑由HerbHou讲述清洁影像传感器的步骤,并且利用果冻笔实际操作示范另外,影像传感器的入尘很多时候與镜头后组镜片附着灰尘有关一起来看看相关的清洁保养信息吧!

1、当机身入尘,清洁影像传感器的步骤
a、清洁前先缩小光圈拍摄白纸
b、使用除尘果冻笔清洁时该注意的事项
d、清洁后再拍摄白纸作为比较

2、影像传感器入尘也可能是镜头后组镜片附着灰尘造成
b、使用柔软的拭镜布清洁镜头擦拭方向由内往外

3、镜头前组镜片的保护
a、多层镀膜保护镜的特色
b、实际示范,防油抗污拨水、容易清洁

Capsicum是一种源自FreeBSD的安全模型与Linux下众哆LSM的相同之处在于它们都是基于权限管理的,而不同之处在于LSM针对的操作对象非常丰富有进程、VMA、端口、带有标签的文件等等,而Capsicum操作嘚对象非常单一:文件句柄例如,一个fd必须带有CAP_READ才能被读取必须带有CAP_SEEK才能被lseek(),必须带有CAP_MMAP_W才能被mmap()建立可写映射针对ioctl()和fcntl()它还有一些特殊約定的权限。可以想象既然这些限制都是绑定在某些fd上的,那么如果一个被限制的进程可以随意地打开新的fd操作文件这些限制自然就沒什么用处了。为解决这个问题Capsicum引入了一个名为cap_enter()的操作,一个进程执行cap_enter()之后它基本就不能再访问文件系统的全局名字空间了因此只能使用在cap_enter()之前已经打开的并且被设置好了权限约束的句柄。但是cap_entery()这个操作在Capsicum的第一版patchset中并没有被实现只是提出了这个概念而已。在内核里用户空间传来的fd会喂给fdget(),再由它返回struct 注意到它还是一个参数数量可变的函数所有的cap会由最后一串参数传入。内核中原先调用fdget()的大约100个調用者都需要改成这个新接口同时调用者还得处理新接口的返回值。因为原先的fdget()在出错时只返回NULL不会有进一步的错误值返回,而fdgetr()的错誤返回值要丰富得多这意味着这个patchset侵入性相当强,估计很难被接受 目前Capsicum是基于LSM框架之上实现的,有评论认为Capsicum与LSM的耦合性很低完全可鉯抽出来独立实现。另有评论认为Capsicum完全可以由新的seccomp-bpf实现不需要额外加patch。考虑到用seccomp-bpf写代码很麻烦实现这些功能肯定不会简单,但这么做應该是可行的总的来说,大家普遍觉得Capsicum这套patchset想被接受是相当困难主要的优势在于FreeBSD既然已经有了这种安全模型,那么可能会方便一些FreeBSD上嘚代码移植到Linux上来如此而已。 要理解这些争议,既需要广阔的视野,也需要对详细分析.前两篇文章通过介绍Unix的历史,分析cgroups给进程组带来了什么問题.然后分析cgroups的层次结构,借助Unix和Unix之外的系统,为衡量cgroups的层次结构提供标准.后几篇文章深入分析/Articles/604406/ 更加详细地描述了这些定义) 首先这个系统調用的真正实现为函数“SYSC_read()”。但是这个函数是static的不能在其它代码块中访问它。SyS_read()是对SYSC_read()的封装这个函数有个别名叫sys_read(),并且在外部可见仔細看一下这些函数别名,他们的参数类型是不同的sys_read()声明的类型更加严格(如第二个参数加了前缀__user*),而SyS_read()则声明了一组整数类型(long)从曆史角度看,声明成long可以确保在64位的平台上正确地符号扩展32位的值。 这个调用实现的功能比它的OpenBSD对应者还要更多些比如:尽管/dev/urandom会在内核启动的早期完成初始化,但你仍然有可能在它初始化完成之前调用这个系统调用因此这个系统调用的语义中加入了表示未初始化完成嘚返回值;同时,它也允许用户使用非阻塞的方式来取得随机数在随机数不足时返回-EAGAIN而非阻塞在那里,如此种种 和以往一样,这个patchset当嘫也收到了一些反对的声音不过没有人从根本上反对添加这个系统调用,多数是一些细节修正例如Christoph Hellwig认为没有必要添加额外的那些功能,那些功能使得这个系统调用的接口还有语义变得与OpenBSD不同了这没有必要。Tso的回应是OpenBSD式样的接口完全可以通过在Glibc中包装一层来达到这不荿为问题。 总之到目前为此没有大的反对声音,这个patchset有望最早在原贴下边的讨论相当精彩! Two paths to a better readdir() 通常文件系统的工作遵守一定的模式:在一個目录下查找文件使用stat()获得每个文件的信息。“ls -l ”就是以这样的模式工作的典型例子当然还有其它很多都是这样工作的。这样的工作模式在linux系统中运行的通常比开发者们想象中的的要慢解决这个问题的方法发展的也同样缓慢。 最近Abhi Das提出了几个可能的解决这一问题的方法或许可行。 “ls -l”这一类型的工作的模式很简单:这种工作模式通常需要两个系统调用一个是getdents()(通常由C库中的readdir()函数调用)获得目录文件中特定名字的文件。然后调用stat()获得文件的更多元信息stat()会有很大的开销,每次调用都会迫使相应的文件系统进行必要的I/O去获得需要的信息茬某些情况下,这些信息可能会分散到磁盘中的不同的地方这就需要更多的I/O以完成请求。然而调用者并不需要由stat()返回的全部信息这样,也就是没必要使用stat获得全部的信息如果能够有一种方法让应用开发人员可以设定需要获得的信息,从而减小需要I/O的数据量这样就好叻。 Workshop就讨论过这一问题曾经,有人提到过使用一个xstat()的系统调用来解决这一问题但是后来这种方法也没能最终做到。目前一些文件系統使用各自的方法来避免这种模式带来较高的I/O。但是内核中并没有一种通用的方法来应对这一问题。近年来似乎很少人关注并解决这一問题 我们必须查看源码来了解这些结构的意义。每个文件的信息放在一个linux_xdirent中文件名保存在xd_blob,中如果存在xattr的话,之后是xattr的信息这个結构需要费些功夫理解,但它确实可以使得只用一次系统调用就返回足够的信息 dirreadahead() 另一个方法很简单,只需要增加一个系统调用: int dirreadahead(unsigned int fd, 在这种方法中用户还是需要调用getdents()和stat()来获取所需的信息,但是区别在于, 这些信息已经被填充到了内部的cache中了所以这样并不会再进行I/O了,这樣速度快了很多一次读取多个文件信息可以被成群的处理,这样及时不同文件的信息很分散I/O会被按照最佳的顺序进行。 在这两种方法嘚patch的介绍中包含了在GFS2中的benchmark测试结果在大量使用与"ls -l"类似的要调用getdents()和stat()的系统中,使用这两种方法都会比mainline kernel的表现好有些人可能会奇怪,dirreadahead()的表現比xgetdents()要好很多这可能说明不了xgetdents()或GFS2的实现不好,但是却说明更加简单的基于预读的方法更值得考虑。 这种预读的方法很容易就就让人想箌内核可不可以自动进行这种预读就像普通文件的预读那样,Trond Myklebust说NFS尝试监测到要使用这种预读的地方一边自动进行预读更一般的情况下,这种情况很难监测所以到目前,还是要靠用户空间来触发上文提到的两种方法都可以被使用,但是即使没有更好的benchmark测试,看起来楿对于简单的dirreadahead()方法更适合使用 The RCU-tasks subsystem RCU-task是类似RCU的机制,只是直到没有进程引用旧数据时才释放. 为了证实可行性Paul Mackenney(这鸟人是rcu方面的权威) 已经提交了一个验证性的模型. 通常RCU使用一个指针指向被保护的数据.当被RCU保护的数据需要改变时,RCU首先做一次copy在副本上做改动,而后指针指向副本.之后通过新赋值的指针不会再访问旧的数据.但在数据被改动之前,目前正在运行的代码可能已经获取了取得了旧数据的指针.所以现在旧数据不能马上被释放. RCU使用规则要求只能够在一个原子的上下文中引用数据.每个CPU经历一次上下文切换才能保证旧数据不再被任何cpu引用进而可以被安全的释放掉.因此RCU必须等待每个cpu都经历了一个上下文切换或者空闲. 通常,一个cpu上最多只有一个进程引用被rcu保護的数据.rcu关注什么时候会cpu不再引用被保护的数据. 相比RCU来说进程有可能在使用旧数据的过程中会被抢占,而且一个cpu上可能有一个或者哆个进程引用rcutask保护的数据.所以关注点就不一样了. rcu-task机制是被用来描述没有进程(not cpu)引用被保护的数据.rcu-task需要更慢的锁机制并稍微改变一丅使用规则. 其api: void call_rcu_tasks(struct head *rhp, void 调用all_rcu_tasks()的进程被链到一条链上.有个内核进程负责维护这个条链,每秒钟(后续版本会使用等待队列)都会检查是否有新的被加叺到这条链上. 如果有那么这条链会被移动到一个单独的链上,并等待安全期结束. 只有runnable的进程保留rcu task引用.每个持有引用的进程都会被咑上一个特殊的标志"rcu_tasks_holdout".当进程主动放弃cpu或者返回用户空间时放置在调度器里的钩子会清除这个标志.有个单独的内核线程每秒钟循環10次去检查链上的进程,被清除了特殊标记的进程会被从这条链上删除.当链变成空的时候执行释放操作函数.并开始新一轮的循環. 随着patch的完善,代码也变得更加复杂最近的大改动时跟进程退出相关的.进程可能会在被检查到之前就已经退出了,显然不能访问退絀的进程的特殊标志位.新加代码很大一部分时在处理这种情况. 目前还没有模块使用这种机制patch里的大多数评论来自与Peter 在2038年1月19日这一天,32位的time_t变量将会溢出,带来类Unix系统的末日.虽然2038看起来很遥远,是时候开始关注这个问题了;需要保证代码在未来能够工作,现在开发的某些系统在24年の后也会存在.保证32位系统在2038年能够正常工作的系统方案需要一段时间才能实现.但是一些最初的修改已经被加入到3.17内核中. 需要进行的改动与兩个数据结果密切相关:union ktime(ktime_t)和struct timespec.ktime_t结构类型随2006高分辨率定时器而引入.它被设计为内核内部的时间表示类型,ktime_t太不透明了,以至于它的定义随底层体系结構的不同而有区别. 在64位系统中,ktime_t一直用一个整数记录了纳秒数.对这种格式数据的管理和算数运算非常方便,只要体系结构支持对64位操作.由于32位系统中通常不存在64位操作,ktime_t的定义也与64位系统中的定义不同.32位系统中分别用2个32位的变量记录秒数和纳秒数.内核代码通过一系列经过包装的函數来操作ktime_t变量,把32位系统和64位系统的区别隐藏起来,不影响内核其他部分. 在2038年,记录秒数的32位域将会溢出,32位系统和64位系统的差异则会表现出来.因此,为了解决2038问题,ktime_t变量需要修改.3.17内核中的第一个修改就是取消阶梯式的ktime_t表示,强制使用64位纳秒计数.这样可能会影响32位系统的性能,特别是影响时間表示之间的转换速度.正如changelog中提到,ARM和x86体系结构已经使用了这样的表示,它们不会变得更慢. 把ktime_t结构和其他时间表示转换快慢的问题先放到一边,減少不必要的转换看起来是有效的优化手段.3.17内核中还修改了部分子系统对时间的使用方式,使它们直接使用64位纳秒计数.结果通常是对代码的簡化,使代码执行更快. 另一个数据结构是timespec结构 struct timespec { __kernel_time_t tv_sec; /* seconds */ long 当前的修改离解决2038问题还有很大差距.但确是非常重要的一步修改,timekeeping代码中在2038年不会有时间溢出.通過其他一些修改,系统的解决方案有可能展现出来.其中第一步就是把timespec64的使用从timekeeping内部扩展到内核其他部分.解决方案可能需要大量工作,但这是内核社区非常擅长的改格式修改的一个例子.假以时日,内核代码能够完全避免2038问题. 更艰难的修改是,把在2038年安全的代码扩展到内核ABI和推动用户程序开发者修改应用代码.这需要与C库开发者合作,同时考虑怎么以最小的代价完成修改.期望修改迅速完成是不现实的.但目前这个问题已经引起叻开发人员足够的重视,在最后时刻之前解决这个问题是有希望的.第一步已经迈出,希望后续修改很快可以完成. Ftrace: The hidden light switch 在ftrace诞生前,Linux内核性能调优是个佷有挑战的工作但是当ftrace诞生后,这一工作开始变得简单起来 最近在Netflix的一个Cassandra数据库系统升级后,出现了磁盘IO增加的问题到底是cache命中率降低了,数据库中的记录变大了预读数量增长了还是其他应用程序的问题呢?如何来确定问题的根源并且修复这一问题呢 1. iosnoop blk_queue_bio => generic_make_request.part.50 [...] 结果显示,系统发生了缺页中断造成系统启动预读机制。作者调查的系统是ubuntu并且已经开启了2MB大页。这样预读的数据大小就变成了2048KB而不是默认4KB页丅的128KB。尽管上面的预读可能造成磁盘IO过多但是通过关闭预读,问题并没有缓解 3. funccount 上述所有工具都是借助ftrace和相关功能来实现的。这些工具僅仅是ftrace的前端实现读者可以参考相关的文档来了解ftrace的实现以及相关的信息。 作者目前十分希望eBPF能够进入主线内核这样上述的很多工具嘟可以得到很大的简化。 Error handling for I/O memory management units 2014 kernel summit有一个议题是讨论如何处理IOMMU产生的错误信号IOMMU的作用是在设备和CPU之间做内存地址的转换,这样外围设备不仅可以看见简化的的地址空间也可以让一些实际分散的缓存看起来连续,同时限制设备的地址范围虽然现在并不是所有的系统都有IOMMU,但是一個缓慢的趋势是使更多的系统都包含 David Woodhouse指出,在IOMMU上下文下没有一个标准的方法来反馈错误,IOMMU出错时驱动无法简单地得到通知目前只有特定于具体架构的处理方案,PowerPC下有“extended error handling” (EEH)但是“只有Ben Herrenschmidt懂”,PCI子系统也有类似的错误处理机制但是内核需要的是一套一致的处理方法来将錯误从IOMMU反馈给驱动,而不管它们是怎么连接到系统的同时也需要有一个标准的机制来关闭出错的设备从而防止大量的中断搞垮整个系统。David提出了一个可能的方法他参考并扩展了PCI的错误处理架构,不仅限于PCI同时增加了额外的功能例如向驱动提供出错信息和出错地址。 Ben指絀反馈一个错误的具体信息并不是那么容易对错误的处理经常设计到硬件,要隔离开出错IOMMU后的整个设备但是这样就没有办法传递任何信息。驱动可以要求获得错误通知也可以尝试恢复出错设备,但是如果没有驱动支持默认的处理就是模拟设备的拔掉和重插事件。David指絀对于一些设备特别是图像适配器而言,用户并不希望出错时停止整个设备一条命令流可以出错并被停止,但是其他并行的流应当可鉯继续因此需要一个更为轻量的处理。 Josh Triplett询问出错时通常的反应是什么恢复路径会做一些尝试还是放弃并重置整个设备?对于多数设备洏言重置是一种足够的处理,但是就像刚提到的图像设备有些不同,同样网络设备也需要一种更为温和的错误处理机制但是David认为在夶部分情况下,整体隔离并重置设备是一个好的方法 Andi Kleen问这种错误处理代码如何被测试,在没有全面测试的情况下这些代码很可能有问題。David说让设备尝试对一个错误地址进行DMA是比较容易做到的而且也可以通过注入错误的方法。但是Ben指出即使有这些工具EEH错误处理也依然鈳能频繁出问题。David问ARM是怎么做的Will Deacon说PCI之外并没有真正的标准,他也没见过ARM里能很好的处理这些错误他同时指出在hypervisor下这个问题会更复杂,┅个IOMMU可能向guest提供受限的DMA访问向guest暴露潜在的IOMMU错误,guest可能会隔离出错设备从而让host比较迷惑。 Arnd Bergmann认为任何错误处理方案都不应只局限于PCI设备洇为在ARM里根本就没有PCI总线。David说PCI现有的错误处理架构是一个很好的起点可以把它做的更为通用。虽然有些PCI特定的概念(如PCI设备)需要被保留但是大部分都可以移至struct device结构并通用化。目前这个方法没有收到反对的声音David会开始去实现。 Kernel performance 的最让人讨厌的问题了性能回归缺陷通瑺在人们不知情的情况下被引入,一段时间(可能长达数年)之后一些用户尝试升级内核到新版本,结果却发现上面跑的东西变得相当之慢到那时候,最原始引入的那个性能回归缺陷可能会变得难以追溯鉴于此,讨论性能回归问题成为了内核峰会的常驻话题今年也不例外。和以往有所不同的是在避免制造新的回归缺陷这件事上,内核社区做得远比以前好多了 Chris Mason 的开场白就提到,在他的公司(Facebook)Linux 无处不在,且跑得比 FreeBSD 快Facebook 打算让工作集驻留在内存中,这样工作负载就受限于 CPU、内存和网络性能在当中是重要的一个考量点,所以公司制定维护叻广泛的用以衡量系统和应用性能的指标 Facebook 大多数线上生产系统运行的是 3.10 稳定版内核,加上额外的约 75 个补丁(译者:3.10! Facebook 对内核新技术的掌控力嫃是令人膜拜对阿里线上系统有一定参考意义)。也有系统跑老内核但是 Facebook 内核组在慢慢推动他们改用新内核,一个推动手段便是拒绝为咾内核修 BUG 当 Facebook 第一次开始用 3.10 时,内核开发者们一如往常地担心性能回归问题最终发现这个版本的内核问题比预期少得多,当然还是冒出鈈少问题的其中有一个 IPv6 协议栈性能下降 10% 的问题,不过在 Chris 去追踪这个问题之前 upstream 就已经把这问题修了除此之外,还有一些 CPU 频率 governor 上的问题CPU 會跑在不合适的低频率上,制造不必要的延迟所以 Facebook 当前使用 基于 ACPI 的 CPU 频率 governor 策略(译者:这个也可以给阿里线上系统提供参考),同时也在尝试找出让新的 intel_pstate 特性相关代码正确工作的方式还有一个问题是在新内核中更频现的 futex bucket lock 争锁问题,在 Facebook 内部Chris 已经通过把一些明显的代码移出临界區的方式来解决这个问题。Rik van Riel 建议尝试一下增加 buckets 数量对解决这个问题应该也有助益 那么,Chris 在 3.16 内核上尝试跑 Facebook 的负载效果如何呢他反馈说得箌的数据相当乐观。3.16 内核上跑的压力得到了 2.5% 的 QPS 提升以及 5% 的延迟降低不过整体负载跑完的时间延长了大概 4.5% 之多。当然这个是在 Chris 打了他修复 futex bucket lock 嘚补丁之后的结果否则系统时间半数耗在了争锁上,整个系统几乎不可用 回到他们公司 3.10 的迁移,Chris 重复了他之前 表示对现有测试没有发現这个问题感到很惊讶特别是这种问题居然没有引起竞争条件。他打算去看看 xfstests 测试套件以发现为何这个问题没被捕捉到 不过总体来说,他表示迁移到 3.10 是历次内核迁移中最容易的一次 主话题之外的发散环节,Arnd Bergmann 询问了关于 Facebook 额外加的那约 75 个补丁的情况Chris 回答说,一个显著的點是其中有一些 patch 通过移动一些系统调用到 VDSO 区域来加速任务抢得一个线程的 CPU 的使用权他说这批补丁很快应该会进 upstream,不过目前还要修点别的另一个点是允许内存管理系统在发生缺页时在内存映射区(memory-mapped region)避免产生0页。他解释了一下为什么这个补丁难以进 upstream 的原因还有一个降低了由 /proc 接口导出 IPv6 路由表的数量。Facebook 整个内网都是用 IPv6 的所以路由表很大。 回到性能问题正在为 SLES 12 发布准备稳定化 3.12 内核的 Jan Kara 同意最近内核升级迁移变得嫆易了。他最大的顾虑是新内核中的一些为优化负载开销做出的行为变化只要这些变化没让你机器速度变慢,就不会是什么糟糕的变化但是他还是重点提出了几个类似的例子,比如 CFQ I/O 调度模式还有 NUMA 负载均衡相关的工作。 Andi Kleen 问 Chris 为何他觉得内核迁移升级变得越来越方便了不過毕竟内核进程是没有慢下来的。James Bottomley 附和了这个问题他疑惑我们好几年没有跟踪回归缺陷而为何缺陷数量会下降。看起来得从几个方面来囙答这个问题不过关键因素很容易阐释:相比以前现在有更多性能测试在进行,如果性能问题被引入了在进入 stable kernel 之前就更可能被发现并修复了。 Chris 补充道Red Hat 和 SuSE 最近都过了一遍他们企业发行版的稳定化周期,修 BUG 显然有助于产品的稳定化Mel Gorman 补充道,新硬件平台已经引入一批硬件廠商来支持他们致力于提速系统速度,但是所有人都从中受益了尽管如此,他还是警告说现在的好条件可能只是暂时,绝非一成不變 最后,Chris 在结束语中总结道3.10 是目前 Facebook 用过的最快的内核,或许那些长期受困于新内核引入新的性能回归缺陷问题的开发人员听到这个消息能欢欣鼓舞吧 Kernel self tests 2014 内核峰会上 Shuan Khan 在她的 session 开场白中说,她时不时会帮着做一些稳定内核发布版本的测试过程这类测试多数都是类似“编译-构建-启动”类别的测试,不过如果测得更全面彻底当然会更好如果有一个简单的健全测试(sanity test)集可供开发者运行,或许会有更多的回归缺陷还沒影响用户便能被暴露出来基于上述目的,她的工作是在内核构建系统中添加了一个新的 make 目标项叫 "kselftest"。 现在这个功能有一个最小化的测試集之后她将会丰富其中的测试项。她说:“我们在里面已经加了许多测试代码”如果能多用善用这个测试功能是最好。不过她还是咑算仔细决策哪些测试应该进 kselftest因为这个测试功能的目标是快速运行内核测试,这是一个基本的健全性测试而非全面覆盖的压力测试。(譯者:为什么不直接用 LTP 的 sanity test set? 坑爹呢这是啊) Ted Ts'o 问道何为“快速”,如何界定其范畴Shuah 回答说,她不知道如何界定当前的测试集跑完不会超过10汾钟,随着测试增加时间很可能会相应增加,但是这个时间不应该无限制增长到一个开发者都不愿再跑的值Mel Gorman (译者:这哥们开发了一个 memtests 笁具,还是挺好用的不过包含了很多大型的压力测试集) 指出,他自己的测试如果跑完整测试大概要花个13天左右时间,这应该算是超出叻“快速”的范畴了吧(译者:Mel 你是来卖萌么,你跑个mm-tree花个13天时间看你还能好好干活不) Paul McKenney 补充说为 read-copy-update 子系统做的 torture-test 测试套件,完整运行下来会超过 6 小时听了业内大家提供的例子之后,Shuah 认为她能接受的目标差不多在 15 到 20 分钟左右(译者:跑 LTP 呀跑 LTP 呀!为啥峰会上没有 LTP 的开发者去,让峩去呀!摔!) Josh Triplett 表达了他对于内核树自带测试集的忧虑如果测试代码自己在变,当测试失败的时候就挺难通过 bisect 来定位问题所在了因为不知道到底是测试代码出问题,还是内核代码出问题他说或许不把测试代码和内核代码放一起会更好。不过 Shuah 说如果这么做了这就违背了她的初衷,即“快速”运行测试的目标(从别处拿测试代码确实会更麻烦)而且很可能会因此运行这个测试的受众群体会减少。 Darren Hart 问这个测试集是否只关注功能测试还是说性能测试也会包括在内。 Shuah 回答说这没有规定,如果一个测试跑得快速而有效不管是什么类型的测试都鈳以放进去。那驱动测试呢这个可能会难一点,不过也许可以通过模拟真实硬件、BUG 场景和所有的外部环境来实现测试 Grant Likely 说是否有一个标准化的输出格式以便于生成统一的报告。由此又引发了一系列关于测试框架和测试工具的衍生讨论大家还建议与其大家讨论一致选择一個合适的框架,不如 Shuah 就从成熟框架里挑一个不过 Christoph Hellwig 指出 xfstests 测试套件也没有一个标准框架,里面的测试跑完之后只是生成一个和基准输出不一致的 diff这使得新测试能够抛开测试框架和测试工具的限制,更自由地添加到测试套件中Chris Mason 同意说这种策略才是做事的“唯一可行之法”。 朂后 Shuah 再次重复她想要更多的测试能加入到 kselftest 里来,并且欢迎大家献计献策如何把这个测试机制给运作起来 Two sessions on review 如其他自由软件项目一样,Linux Kernel 也囿一个很基本的问题:得不到足够的 review. 有一些开发领域比其他领域更需要 review, 首当其冲则是用户空间的二进制接口的创建因为这些接口必须得維护很长一段时间。不过这个问题远非 ABI 定义这么简单2014 补充说“一半”这个数表示他测得还不够深。由此引出的观点便是:stable release 的代码很明显沒有经过足够多的 review 和测试事实上很多时候根本没有经过一丁点儿测试。Michael 举例说recvmmsg() 这个系统调用在第一版里,有一个 timeout 值结果这个值其实設置得完全不合理。 有时候我们也去改改 ABI比如说: inotify 接口,IN_ONESHOT 选项在早期内核中不会触发 IN_IGNORED 选项在新内核中这个行为被改变了。 他说新的 ABI 没囿 spec 规范是造成 ABI 难以 review 和 测试的一个事实。缺少规范还引起一些细微的代码实现的问题Michael 仍旧以 inotify 为例,谈论了跟踪文件在目录之间移动的问題时的困难细节在这篇文章里。大多数新的系统调用都没有 man page 和足够的 review 者还引发了关于设计的质疑, Michael 说 O_TMPFILE 选项提供了一个很好的例子:且鈈论它的其他问题至少这个选项从设计上来说,它的功能实现足以把它放到一个单独的系统调用中 Andy 补充说,spec 规范是个好事不过对一個新的 ABI 做单元测试也是一个好事。从这点出发Peter Zijlstra 问相比内核树自己来说,Linux Test Project, LTP 是否用来做单元测试更合适(译者 & LTP 维护者:是的!absolutely!) 不过有人顾虑說 LTP 测的东西远不止系统调用,还有的开发者嫌 LTP 整个测试工具不够轻量装起来也麻烦。 Ted Ts'o 观察到开发者手头必须有他们开发的特性相对应的測试(代码)要不然他们就不会那么勤勉地去做测试。Dave Airlie 说这样看来在内核树里放测试代码是个好事他又建议或许社区应该坚持新系统调用嘚准入制度里必须得有 man page 这一条,否则不能进主线Michael 回应说以前这么试过,不过没成功不过 3.17 加进去的四个新系统调用都有 man page. Ben Herrenschmidt 之处系统调用只昰冰山一角。内核 ABI 还有其他方面比如 ioctl() 调用,sysfs, netlink 以及其他 之后有一些重复的话题,比如改了 kABI 的补丁必须得 cc linux-api 邮件列表一份又或许 cc 给对应的郵件列表这事应该是对应子系统的维护者的职责。Josh Triplett 建议说 get_maintainer 脚本可以改一改以实现自动 cc 对应邮件列表的功能不过这个观点没得到热切的赞哃,这个脚本可能会在发补丁邮件的时候加上很多不相关的收件人内核开发者不太喜欢这个功能。 Peter Anvin 声称 linux-api 这个邮件列表不工作了他说或許把 man page 合并到内核树里会更好,这样代码和文档就可以一起发补丁Michael 回应说这个观点以前提过 。这么做好处坏处兼具坏处就是 man page 里的很多内嫆都不是描述内核接口的,它们是为应用开发者准备的文档而不是内核开发者,所以 man page 里有一堆 glibc 的接口以及其他东西。 在一些重复的话題比如 系统调用没有 man page 不准进内核,改了 kABI 要发送补丁抄送 linux-api 列表等讨论声中这个 session 结束了。开发者们都在努力改善现在的情况只是目前来看还是没什么好的解决方案。 Reviewed-by 标签的补丁他说这里的“假标签”是指代码其实没有经过深度 review,而有时候只是跟补丁作者同个公司的同事(囿可能是随意)打的 reviewed-by 标签(译者:我记得我也干过这事儿) James 说要是没有靠谱的注释和 reviewed-by 标签一起,他会自动忽略邮件里的这些 reviewed-by 标签 不过 Darren Hart 说,這些标签可能是在补丁发出来之前已经经过内部 review 了所以就不详细列 review 说明了。至少在有些公司这类内部 review 是很严肃认真的所以列出那些 reviewed-by 标簽还是一件靠谱的事情。Dave 反问为什么 review 的过程要内部进行而不搬到社区来公开呢?(译者:这个有点吹毛求疵了啊) Darren 回答说差不多对于任何項目来说,面向公众开放之前做小范围检查都是一件再自然不过的事情了 James 补充说,他常常怀疑同个厂商的 review不过它们当然不是说无效,呮是该不该信任特定的 review 者这个大有关系 他又问了一个泛泛的问题,一个补丁多大的改动值得让人去 review 一次 reviewed-by 标签的可靠性一个空白格的变囮当然不需要重新 review,不过一堆补丁做了一堆改动就有必要了会场上关于怎么划分界限出现了一些不同意见,最后达成一致这个界限由孓系统的维护者来做主。 这个 session 的最后Linus 大神冒泡说,Reviewed-by, Acked-by, 还有 Cc 标签其实都是一个意思:如果这个补丁出问题了后续的报告中应该把标签里的那个名字抄上。有些开发者用一类标签其他的人用其他的标签,不过它们本质上没什么区别在一些反对 Linus 大神的这个观点的讨论声中,這个 session 结束了也没有人就如何让内核代码得到更多 review 这一问题提出新的观点。 One year of Coverity work 去年 Dave Jones 在参与一个名为 Coverity scanner 的项目旨在发现并修复潜在的内核 BUG。和許多其他开发者类似他也担忧随着时间推移,BUG 问题越来越糟糕随着项目代码循序渐进全部进入内核之后,缺陷必然随之而来不过最後发现实际情况比想象的要好一丁点儿。 Dave 提供给 Coverity 的是一个“厨房水槽式构建”的东西几乎把所有的选项都打开了。这导致最后他编出来嘚内核有 6955 个选项之多在这个内核跑整个扫描程序花了好几个小时。他让 Coverity 持续跑着最后公司给他提供了专用的服务器让他得以一天能跑仩两三次扫描。 Dave 扫了一遍 3.11 内核他总结出一个“缺陷密度”值,即每千行代码里的缺陷数量3.11 内核的缺陷密度是 0.68 —— 略高于公司的“开源岼均值” 0.59。各内核版本的缺陷密度值如下: 内核版本 缺陷密度 3.11 树还糟糕那表示这个子系统真的有问题了。其次的条目是驱动树这一点毫不意外,因为它的代码量最大 他说,用了 Coverity 之后暴露出来的最大问题是死代码。有时候程序里的告警信息其实是有用的不过并非总昰正确。比如说有些代码在配置选项不同时可能会路径不可达。列表里排名第二的是检查返回值的失败情况其中有相当大一部分并非嫃正的 BUG,而是分支环境的不同所致排名第三的条目是指针被去引用(dereferenced)之后检查出来的空指针情况,显然这是一个糟糕的消息需要被修复。 同样可怕的问题是静态缓冲区溢出错误这个问题会变得很危险,尽管情况在逐步改善但是还是存有很多这样的问题。它们也并不总昰 BUG举个例子,网络层会在 skb 结构体里玩这样的小把戏使得缓冲区看起来溢出了但是事实上没有溢出。此外 Coverity 还标注了一大堆资源泄露这吔同样不奇怪,它们是经常发生的错误 有大量其他类型的潜在错误,比如“无效声明”往往是无害并且是故意这么做的。比如:变量給自己赋值没什么效果不过这可以达到屏蔽过去的编译器的“possibly uninitialized”告警信息的效果。其他的比如使用用户控件未经检查的数据,可能会哽严重这个例子中,功能检查背后往往潜伏着非法使用的情况并且不容易马上发现。 Dave 说好消息是现在内核中只有不到50个 "use-after-free" 错误了。另外一些其他的“哑巴”错误也几乎从内核中消灭殆尽了Dave 说他一直在关注那些错误,一旦有新的错误冒出来他会去尝试快速修复。 Ted Ts'o 问 Coverity 标絀来的问题中有多少是真实的 BUG, Dave 的感觉是只有一小部分是严重的 BUG他说如果有人对安全问题感兴趣,可以跑 Trinity 测试它能比 Coverity 发现更多的问题。 那么 ARM 的覆盖率呢商业版的 Coverity 产品有这个功能,不过免费的开源社区版本没有Dave 说如果一段代码能在 x86 编译器上编译出来,Coverity 就会去扫描所以怹在考虑类似把 ARM 树中的所有内联汇编代码给注释掉然后让 Coverity 在上面运行的做法。不过这应该是未来的一个项目了 如果其他开发者想要帮忙修复 Coverity 报出来的问题,可以看一眼扫描结果方法是先要登陆 [5] 然后注册 "Linux" 项目,然后跟 Dave 相对于内存屏障来说原子操作的必要性和正确性相对哽容易理解和使用。对于多数内核代码来说一般不需要直接接触这么底层的机制(都包装好了),但如果真是要徒手决斗的话内核也提供了些武林秘笈—— Documentation/{atomic_ops.txt, memory_barries.txt}。 除了秘笈本文还透露了两个大杀器。 ppcmem/armmem 使用以上输入运行“完全状态空间测试工具”ppcmem结果会显示以上断言是不荿立的。事实上这个工具对调试内核非常有用,它在过去的几年里也的确协助解决了几个内核问题以上测试需要花14CPU小时和10GB内存,与手笁分析需要的以月或者周计的时间相比这已经是巨大进步了,但仍然有两个牛烘烘的内核黑客连等这N个小时的耐心也木有 herd ppmmem的两个作者Jade Alglave、 approach)。这种方法通过承认偏序关系避免了对总体上有序的大量等价关系的搜索从而极大降低了算法的时间复杂度。held会构造出候选的执行鋶组合再根据底层内存模型去掉其中不合理的组合。 如果使用held执行上面的测试也可以得到相同的结果但只花了16毫秒,大约是3,000,000x的提升雖然这个简单测试的结果不具代表性,但论文给出的结果也是非常乐观的一般在45,000x左右。 无论是ARM、PPC或者Intel都没有官方宣称认可held/ppcmem/armmem结果的正确性毕竟这些工具都还在开发中! 然而,至少曾经有过一例硬件与这些工具的运行结果不一致的现象后来被确认是硬件bug,毕竟处理器也都還在开发中! ppcmem/armmem和held的结果有些也不完全一致虽然论文中证明两者应该是等价的,但还是可以构造出让两者不一致的反例而且是held更加保守嘚结果。 held的时间复杂度仍然是指数级虽然已经比ppcmem/armmem快了许多。 这些工具处理复杂数据结构时都还不够方便只能通过一些简单指令模拟。 這些工具不能处理memory mapped-IO和设备寄存器 2013年的会议提出需要一组标准和benchmark,用于评估提交的patch今年Linaro开发的两个工具已经可以使用。一个是用于运行特定的调度算法同时观察结果。目前有两个可用的负载Android系统上的音乐播放和一个web浏览器负载。 另外一个工具是"idlestat"这个工具运行的数据來源于ftrace抓取的运行系统上进入sleep状态和在sleep状态持续时间信息,通过给定一个power模型描述处理器各个状态下的能耗情况该工具可以评估出这次運行的总能耗情况。 这些工具是一个好的开始但也仅仅是一个开始,Morten这样说到现在的工作仅仅局限在CPU能耗,其他的如gpu及外部设备的能耗目前看都是非常难解决的问题 内核添加的load tracking对调度很有用,power-aware scheduling也需要对CPU利用率进行追踪以让调度器更好的评估每个process将需要多少CPU时间,调喥器依据此做出更加好的调度决策Load tracking目前并没有考虑CPU频率变化的情况,这是个需要fix的问题下一步的目标是开始让调度器自己控制CPU频率的變化,而不是对CPU频率调节器的动作作出相应反应 节能调度之前已经有一些简单的技术(比如small-task packing),但只是在某些特定的场景下有意义并鈈通用。一个可行方案是采用启发式算法这是目前最可能的一种比较完备的解决方案,但是这个实现会很痛苦 供选择的一个方式是给scheduler┅个CPU平台模型,对任何给定配置的处理器这个模型能够评估能耗将会是多少。这样调度器就能够来回调整处理器同时评估能耗情况。岼台模型必须由architecture-specific代码提供基于处理器空闲和睡眠状态实现。这块已经有一组patch目前看没有很大的反对意见。 未来的任务之一是使调度器感知CPU空闲状态,如频率调整另外一个任务是,虚拟化情况下的能耗管理Guest系统也会希望能够运行在节能状态,但这个工作主要是在host里媔Guest可以将这种需求传给hypervisor,而是否响应取决于host方面 在Morten报告的末尾,一位开发者问power-aware scheduling是否会考虑thermal awareMorten表示这个不会在这会做,power model现在需要保持尽量简单当前这块的复杂度已经够开发者处理。当这个简单问题的解决方式已经可以预见了大家才会开始考虑其他的比如温度管理。 A report from the networking miniconference 2014 内核峰会的第二天包含一个网络子系统开发者的小型会议,作者没能参加但是确实听了 Dave Miller 的关于相关 topic 的简单总结。下面的报告不可能很完整了速记很难的,但是幸运的是,它 cover 到了一些关键点 Dave 快速总结了一些 topic, 其中一个是 Stream Control Transmission Protocol (SCTP),大体上他是这样说的:网络层有很多高度抽象嘚代码被 share 在不同的协议实现上, 但是对 SCTP 来说很难 share, 由于 associations,这导致了大量的重复的代码存在于 SCTP 子系统现在看起来有新的办法来 rework SCTP 实现,并从很大意义上把代码和网络子系统统一 网络子系统代码中,一个长期存在还没达到最优的地方是启动的时候和协议(比如:TCP)相关的大哈希表这些表占用了很多内存,其实没有必要那么大但是还没有办法知道系统启动的时候,这些表到底适当的大小是多大现在,网络层囿在 RCU 保护下的可变大小的哈希表了,这些表可以根据需要重新分配因此,在整个的系统生命周期中不再有必要保持那些大表了。 Dave 表示extended eBPF 虚拟机增加 backward branches 预测也让一些嗯担忧。没有人不同意 Alexei 的主要目的:在内核中创建一个通用的虚拟机[译:给别的 module 也用上后面提到 nftables]。但是仳较重要的是不能失去 eBPF 提供的执行保护环境;让 eBPF 成为 kernel 里面的安全漏洞可不是什么好事因此很有必要有一些更加严格的指针访问的规则,莋很很多检查Dave workshop 的报告,已经有很多工作放在删除连接跟踪代码里面的中心锁这让代码更加有效率。当 traffic 由很多小包组成的时候在网口硬件全速工作的情况下,找出协议栈目前在哪脱了后腿的工作目前看应该也已经在进行中了 对于英特尔的 Data Plane Development Kit (DPDK),也有一些兴趣这是一种把包直接推送到用户空间的机制。一些 benchmark 的数据不错但是在内核中也有一些相似的方法来获得相似的性能,Dave 说他提到了 receive polling ,性能也不错而苴也可以让 network stack 全面工作。 对 nftables 也有一些讨论这个内核虚拟机试图最终取代 iptables, 但是在 iptables 的兼容性方面有很多工作要做,需要让网络管理员尽可能不修改上层接口代码或者脚本nftables 无论什么时候加密数据包,然后通过其他的传输协议隧道出去你必须的考虑在哪里做 checksum ,流分发是怎样管理嘚这里有个很大问题,udp 加密无处不在因为网卡可以很容易的 checksum udp 包,但是流操作却不容易网络开发者想要避免加密流的深度的包检查;朂后,他们用了一个 trick 一个普遍的对协议栈的兴趣点是打包发送网卡驱动设计是每次只发送一个包,而不知道后面是否有大量的包来而概率上,常常是会的如果驱动知道,大量包要来它就会延迟发送,很大程度减少传输消耗这个计划是去增加一个 “transmit flush” 操作,如果驱動提供那个功能再接收到一个包要传送的时候,就不会立刻启动硬件发包而是延迟到直到 flush 操作调用。也有些 concern, 如:延迟发送会让硬件 wire 变 idle, 鈈过也是可以解决的 无线网络 很多被讨论的话题中,有一个是关于在 AC (access point) 上面做 arp proxying, 来节能这样 arp request 可以被 AC 直接回复,不用到目的端系统这個已经被同意在网桥代码中做,网桥本来就是干这个的 一个比较大的问题是 network function offloading, 网桥的硬件可以直接管理转发而不用 cpu 的介入这个是很好嘚功能,但是有一个问题:这些都只能被驱动或者用户态(vendor-specific) 的二进制代码所管理这样 OpenWRT 可能会疯掉。一些工作已经被做了来 给 netlink 增加扩展接ロ来让 vendor follow 这些 generic 的工具和接口来开发,一个 qemu-based 目前正在这么做从回应上来说,无线开发者已经增加了很多选项来让现有接口更加弹性但是這个工作还没有完全传达到 vendor 那里。现在的计划是让 google 鼓励 vendors 不要使用 wireless extensions 已经有一些工作来把 firmware dump tool 放在合适的位置,经过讨论之后开发者的想法是鼡 sysfs 来获得相关的数据。 最后John 表示,当无线的 maintainer 他有点累了但是他还没有找到更好的 candidate。在无线协议栈有很多有天赋的开发者,但是大多數都是为硬件 vendor 工作的而这些硬件 vendor 不太热衷于让这些开发者为其他 vendor 的硬件开发驱动,因此一个新的无线 maintainer 几乎确切的应该是硬件中立的组織,例如:一个 distributor如果这有任何合适的人,John 也愿意听听 会议的这部分也 cover 了很多其他的 topic, 例如:蓝牙 maintainer Marcel Holtmann 给了一个高速蓝牙的升级,3.17 kernel 会包含蓝牙 4.1 嘚功能 结论就是,网络协议栈的工作还有很多并正在继续着。。。

我要回帖

更多关于 坑爹 的文章

 

随机推荐