精华内容
下载资源
问答
  • 优化APP启动时间

    2021-06-07 11:34:48
    本文将讲述如何优化APP启动时间。本文首先阐述APP启动过程;然后讨论如何诊断APP启动性能问题;最后m描述一些常见的APP启动时间过慢的问题,并提出一些解决方法。APP启动的内部原理APP启动有3种启动方式:cold start...

    66b52468c121889b900d4956032f1009.png

    8种机械键盘轴体对比

    本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

    用户希望APP可以快速响应并启动。如果APP启动较慢,则严重影响用户体验,甚至导致用户流失。

    本文将讲述如何优化APP启动时间。本文首先阐述APP启动过程;然后讨论如何诊断APP启动性能问题;最后m描述一些常见的APP启动时间过慢的问题,并提出一些解决方法。

    APP启动的内部原理

    APP启动有3种启动方式:cold start,warm start,hot start。每种启动方式都会影响用户启动APP的时间。在cold start中,APP的启动需要从头开始。而对其他两种启动方式,系统只需要将正在运行的APP从后台加载到前台。我们建议总是假设以cold start方式作为优化对象。这样做也可以提高warm start 和 hot start的启动性能。

    为了提高APP启动速度,需要理解在每种启动方式中系统和APP之间发生了什么,做了哪些交互。

    Cold Start

    Cold start是指APP需要从头开始启动,即在开始前,系统进程还没创建APP的进程。cold start一般是在这些情况下发生,即设备启动后或者APP被系统kill掉后,第一次启动APP。在这种类型的启动方式下,缩短启动时间是一个挑战,因为,与其他启动状态相比,系统和APP有更多的工作要做。

    在cold start开始时,系统有三个任务。如下所示:加载并启动APP。

    启动后立即显示APP的空白起始window。

    创建APP进程。

    只要系统创建了APP进程,APP就负责下一个阶段的工作。如下所示:创建APP对象。

    启动主线程。

    创建Main Activity。

    加载View。

    配置屏幕。

    执行初始绘制。

    一旦APP进程完成第一次绘制,系统进程便会将当前显示的背景窗口换掉,并将其替换为Main Activity。此时,用户就可以使用APP。

    下图显示了系统和应用程序如何在彼此之间切换工作。

    72ef1bf594f6b51c50f00084e685e955.png

    性能问题是在创建APP和创建Activity期间引起的。

    创建Application

    当你的应用程序启动时,空白的开始窗口将保留在屏幕上,直到系统第一次完成绘制应用程序。 此时,系统进程会为应用程序换掉启动窗口,允许用户开始与应用程序进行交互。

    如果你在自己的应用程序中重载了Application.onCreate(),系统会调用你的Application的onCreate()方法。 之后,应用程序会创建主线程(也称为UI线程),并创建Main Activity。

    创建Activity

    APP进程创建Activity后,Activity执行以下操作:初始化values

    调用构造方法

    根据当前生命周期状态调用相应的方法,例如onCreate()方法。

    通常,onCreate()方法对加载时间影响最大,因为它以最高开销执行工作:加载和扩充视图,以及初始化要运行的活动所需的对象。

    Hot Start

    应用程序的hot start方式比较简单,开销也比cold start低。在hot start过程中,系统只需要将你的Activity加载到前台。如果你的应用程序的所有Activity仍驻留在内存中,则该应用程序可以避免重复对象初始化,布局加载和渲染。

    但是,如果某些内存为了响应某些事件(例如onTrimMemory())而被回收,则需要重新创建这些对象。

    Hot start与cold start相同的是:在APP完成Activity的渲染之前,系统进程会显示一个空白的屏幕。

    Warm Start

    warm start 包含了cold start过程中的一些子集。同时,warm start 的开销比hot start低。许多潜在的状态都可以看成warm start。例如:用户退出APP,但又重启APP。此时,进程仍在运行,但是APP必须通过调用onCreate()从头开始创建Activity。

    系统消耗了APP,然后用户重新启动。进程和Activity需要重新创建,但是任务可以从已保存的bundle中加载。

    发现并诊断问题

    Android提供了几种方法去发现并诊断APP中存在的问题。Android vitals可以提醒你APP出现了问题,诊断工具可以帮你检测问题所在。

    Android vitals

    Android vitals可以通过Play Console提醒你APP的启动时间过长,从而帮助提高应用的性能。在以下情况下, Android vitals认为你的应用程序的启动时间过长:cold startup 过程消耗5s或更长时间

    warm startup 过程消耗2s或更长时间

    hot startup 过程消耗1.5s或更长时间

    诊断启动时间较慢的问题

    为了正确确定APP启动时间性能,你可以跟踪显示启动应用程序所需时间。

    初始化显示时间(Time to initial display)

    在Android 4.4及以上系统,logcat会输出一个Displayed值。此值表示加载进程和完成在屏幕上绘制Activity之间所需要的时间。 在这段时间内,包含以下一系列事件:启动进程

    初始化对象

    创建并初始化Activity

    加载布局

    你一次绘制你的APP

    Log一般显示如下:1ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms

    在用Android studio查看Displayed时,需要禁用过滤器。因为是系统服务器为此提供服务。下图显示了如何禁用过滤器,以及显示了Displayed日志。

    c15c2221bf6d0c172cd40ad4ef58d186.png

    在Displayed值的时间内不一定加载并显示了所有资源。布局文件中未引用的资源或APP作为部分对象初始化的资源并没有加载。这是因为加载他们是内联过程(inline process),不会阻塞APP的初始化显示。

    有时,Displayed这行日志会显示一些附加信息。例如:1ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms (total +1m22s643ms)

    你也可以使用adb命令查看你的APP启动的时间。如下所示:1

    2

    3

    4adb [-d|-e|-s ] shell am start -S -W

    com.example.app/.MainActivity

    -c android.intent.category.LAUNCHER

    -a android.intent.action.MAIN

    控制台会输出以下内容:1

    2

    3

    4

    5

    6Starting: Intent

    Activity: com.example.app/.MainActivity

    ThisTime: 2044

    TotalTime: 2044

    WaitTime: 2054

    Complete

    -c和-a参数是可选的,指定相应的和。

    完全显示时间(Time to full display)

    你可以使用reportFullyDrawn()方法来测量应用程序启动和完整显示所有资源和视图层次结构之间所用的时间。

    常见问题分析

    本节讨论几个常见的影响APP启动性能的问题。这些问题主要涉及初始化app和Activity对象,以及屏幕的加载。

    app初始化

    当你重写Application类,执行繁重的任务,复杂的逻辑时,启动性能问题就会凸显出来了。如果你在自定义Application中执行暂时不需要的初始化,那么就会增加启动时间。有些初始化是完全不必要的。

    Activity

    一般在Activity的onCreate()方法中往往会处理很多耗时任务。布局太复杂

    磁盘读写,网络I/O

    加载并解码bitmap

    栅格化VectorDrawable对象。

    初始化Activity的其他子系统

    解决方式如下:减少布局层级。使用,ViewStub, LinearLayout->RelativeLayout,ConstraintLayout等。常用工具Layout Inspector,Hierarchy Viewer。

    异步加载资源;先加载部分View,对于比较耗时的,延迟加载

    参考文档App Startup Time

    Android性能优化典范

    展开全文
  • 而且在有的应用场合,对启动时间具有严格的时间要求,尤其在工业或者医疗器械应用领域。此时如何加快Linux的启动,将成为一个挑战,对于大多数应用开发人员而言,由于Linux系统的复杂性,对于如何提高启动速度,往往...

    01 工具链/应用程序优化

    导读:嵌入式Linux在应用中往往希望系统能在尽量短的时间内启动,以提高用户体验。而且在有的应用场合,对启动时间具有严格的时间要求,尤其在工业或者医疗器械应用领域。此时如何加快Linux的启动,将成为一个挑战,对于大多数应用开发人员而言,由于Linux系统的复杂性,对于如何提高启动速度,往往无从下手。那么阅读完本文,将获得清晰完整的解决思路。

    注:本文转载自微信公众号:嵌入式ARM。

    1.降低启动时间的一般思路

    在准备降低系统的启动时间时,思路上应建立以下的切入点:

    • 最快的代码是未执行的代码。

    • 引导操作本质上的很大一部分工作实际上是将代码和数据从存储设备加载到RAM。如所需加载内容越少则意味着加载操作越快。 

    • 如果根文件系统越大,则安装时间可能会越长。

    • 因此,即使未执行的代码也会延长启动时间。

    • 另外在硬件方案设计时尽量选择读写速度快的存储介质。例如,从SD卡启动实际上比从NAND FLASH启动快。

       

    2.启动时间测量方法

    要降低系统的启动时间,则首先需要选择一个可靠的启动时间的测量方法:

    • 在Linux代码中加入对某一个GPIO脚的逻辑电平控制,利用示波器测量GPIO状态。后面将介绍如何在代码中加入对GPIO的控制。

    • 监控串口控制台报文以测量时间,可以使用grabserial。

      参见https://elinux.org/Grabserial

       

    3. 工具链优化

    3.1 从工具链入手

    选择使用合适的工具链,应是第一个入手点,因为所有的运行加载固件都是由工具链编译而成。如果尚未进行其他优化,则更改工具链的好处将更加明显,并且更容易度量。

    您可以在工具链中进行以下更改,这可能会影响启动时间,性能和大小:

    • 编译器版本:gcc和binutils的版本,最新版本往往可以具有更好的优化功能。

    • C库:glibc,uClibc,musl。使用uClibc和musl库编译的根文件系统更小

    • 指令集变量:ARM或Thumb2,是否支持硬浮点。

    • 可能会影响代码性能和代码大小(Thumb2编码与ARM相同的指令,但以更紧凑的方式,至少会显着减小大小)。

       

    C库在创建工具链时进行了硬编码,可供选择的C库:

    • glibc:最标准且功能最全。http://www.gnu.org/software/libc/

    • uClibc:更小且可配置。已经存在约20年了。http://uclibc-ng.org/

    • musl:uClibc替代品,虽比较新但很成熟。http://www.musl-libc.org/

     

    可以对glibc/uclibc-ng /musl进行对比测试:

    1.静态编译hello.c程序并比较大小

    • 使用gcc 6.3, armel, musl 1.1.16:           7300   字节

    • 使用gcc 6.3, armel, uclibc-ng 1.0.22 :  67204  字节

    • 使用gcc 6.2, armel, glibc:                    492792 字节

    2. 静态编译BusyBox 1.26.2并比较大小

    • 使用gcc 6.3, armel, musl 1.1.16:         183348   字节

    • 使用gcc 6.3, armel, uclibc-ng 1.0.22 : 210620   字节

    • 使用gcc 6.2, armel, glibc:                    755088   字节

     

    3.2 指令集选择

    编译rootfs进行测试对比:

    • 用gcc 7.4编译,生成ARM代码:

           根文件系统总大小:3.79 MB

    • 用gcc 7.4编译,生成Thumb2代码:

      根文件系统总大小:3.10 MB(-18%)

      性能方面:Thumb2的性能明显改善(大约少于5%,但是从一次运行到另一次运行,测量的执行时间略有变化)。

       

    4. 应用软件优化

    4.1 测量strace

    strace允许跟踪应用程序及其子级进行的所有系统调用。对于开发非常有用:

    • 了解如何在用户空间上花费时间

    • 例如,轻松查找打开尝试(open()),文件访问(read() /write() )和内存分配(mmap2() )。无需访问源代码即可完成!

    • 寻找耗时最长的开销应用

    • 查找在应用程序和脚本中完成的不必要的工作。例如:多次打开同一文件,或尝试打开不存在的文件。

    • 局限性:您无法跟踪init进程!

     

    关于strace 参见

    http://sourceforge.net/projects/strace/:

    • 在所有GNU / Linux系统上可用,可以由您的交叉编译工具链生成器构建。

    • 更简单的办法:直接拷贝一个现成的静态二进制文件。 参见

    https://github.com/bootlin/static-binaries/tree/master/strace

    • 可以查看进程的操作情况:

      1. 访问文件,分配内存...

      2. 通常足以发现简单的错误。

    • 用法:

      1.strace <命令>(开始一个新进程)

      2.strace -p <pid>(跟踪现有进程)strace -c <command>(统计进程的系统开销时间)

     

    如查看cat操作:

    图片

     

    又如统计进程的调用时间:

    图片

     

    4.2 Linux上的性能监测工具oprofile

    Oprofile是linux上的性能监测工具:

    • 具有两种工作方式:legacy模式和perf_events模式

    • legacy模式:

      1.精度低,请使用内核驱动程序进行配置

      2.使用CONFIG_OPROFILE进行编译配置

      3.用户空间工具:opcontrol和oprofiled

    • perf_events模式:

      1.使用硬件性能计数器

      2.使用CONFIG_PERF_EVENTS和CONFIG_HW_PERF_EVENTS编译配置

      3.用户空间工具:operf

     

    其使用方法:

    • legacy 模式:

      opcontrol --vmlinux=/path/to/vmlinux # optional step

      opcontrol --start

      /my/command

      opcontrol --stop

    • perf_events 模式

      operf --vmlinux=/path/to/vmlinux /my/command

    • 利用opreport获取结果

     

    例如:

    图片

    4.3 perf工具

    Perf 是内置于Linux 内核源码树中的性能剖析(profiling)工具。它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。可用于性能瓶颈的查找与热点代码的定位。linux2.6及后续版本都自带该工具,几乎能够处理所有与性能相关的事件

    • 使用硬件性能计数器

    • 使用CONFIG_PERF_EVENTS和CONFIG_HW_PERF_EVENTS进行配置

    • 用户空间工具:性能。它是内核源代码的一部分,因此始终与您的内核同步。

    • 用法:perf record /my/command

    • 通过以下方式获得结果:perf report

     

    例如:

    图片

     

    4.4 连接器优化

    启动时使用的应用程序组代码:

    • 查找启动期间调用的功能,例如使用

      -finstrument-functions gcc选项。

    • 创建一个自定义的链接描述文件,以按调用顺序重新排列这些函数。可以通过将每个函数放在各自的部分中来实现:

      -ffunction-sections gcc选项。

    • 特别对于具有较大MTD读取块的闪存存储特别有用。因为读取整个读取块后,极有可能读取不必要的数据。

      详细信息:http://blogs.linux.ie/caolan/2007/04/24/controlling-symbol-ordering/

    • 通过如下方法,可以找到有望被优化的地方:

      1.启动一次应用程序并测量其启动时间。

      2.再次启动应用程序并测量其启动时间。由于它的代码应仍在Linux文件缓存中,故其代码加载时间将为零。

    • 从而知道第一次加载应用程序代码(及其库)所花费的时间。链接器优化节省的时间应少于此上限。

    • 然后据此可以决定是否有必要这样对该应用进行链接优化。由于链接优化必须修改应用程序的编译方式,因此此类优化的成本很高。

       

    4.4.1 Prelink 预链接工具

    Prelink是Red Hat 开发者 Jakub Jelinek 所设计的工具,正如其名字所示,Prelink利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可以加快起动速度,还可以减少部分内存开销,是各种Linux架构上用于减少程序加载时间、缩短系统启动时间和加快应用程序启动的很受欢迎的一个工具。

    • 预链接减少了启动可执行文件所需的时间

    • 在Android上广泛使用

    • 必须配置为知道哪些库需要进行预链接,并将为每个可用符号分配一个固定的地址,从而消除了在启动可执行文件时重新定位符号的需要。

    • 请注意安全性,因为可执行代码始终加载在同一地址。

    • 代码以及文档参见

      http://people.redhat.com/jakub/prelink/

    • 支持ARM,但自2013年以来未发布。Buildroot也不支持。但是,x86比较容易实现。

     

    02 文件系统

    1. 文件系统

    不同的存储介质会采用不同的文件系统:

    1)块存储介质 (包括存储卡, eMMC):

    •  ext2, ext3,ext4

    •  xfs, jfs,reiserfs

    •  btrfs

    •  f2fs

    •  SquashFS 

     

    2)Raw 闪存:

    •  JFFS2

    •  YAFFS2

    •  UBIFS

    •  ubiblock +SquashFS

     

    对于块文件系统,特性各异:

    • ext4:最适合较大的分区,良好的读写性能。

    • xfs,jfs,reiserfs:在某些读或写场景中也可能很好。

    • btrfs,f2fs:利用闪存块设备的特性,可以实现最佳的读写性能。

    • SquashFS:对于只读分区,最佳挂载时间和读取性能。非常适合需要只读的根文件系统。

    下面分别介绍各文件系统的详细特性。

    1.1. JFFS2

    用于RAW Flash:

    • 挂载时间取决于文件系统的大小:内核必须在挂载时扫描整个文件系统,以读取属于每个文件的块。

    • 需要使用CONFIG_JFFS2_SUMMARY内核选项将此类信息存储在Flash中。这大大减少了安装时间。

    • ARM基准:对于128 MB分区,从16 s到0.8 s。

    • 与YAFFS2和UBIFS相比,读写性能相当差。

     

    1.3 YAFFS2

    用于RAW Flash:

    • 良好的安装时间

    • 良好的读写性能

    • 缺点:不压缩,不在主线Linux内核中

     

    1.4. UBIFS

    用于RAW Flash:

    • 优势:

      • 良好的读写性能(类似于YAFFS2)

      • 其他优点:更好的磨损均衡(不仅可以在单个分区内,而且可以在整个UBI空间中使用)。

    • 缺点:

      • 不适用于小型分区(元数据开销过多)。请改用JFFS2或JAFFS2。

      • 挂载时间不是很好,因为初始化UBI需要时间(UBI Attach:在引导时或在用户空间中运行ubi_attach)。

      • 由Linux 3.7中引入的UBI Fastmap解决

     

    1.5. UBI Fastmap如何工作

    • UBI 加载:需要通过扫描所有擦除块来读取UBI元数据。时间与存储空间成正比。

    • UBI Fastmap将此类信息存储在几个闪存块中(通常在系统关闭期间在UBI分离时),并在引导时找到该信息。

    • 这样可使UBI附加时间恒定。

    • 如果Fastmap信息无效(例如,不正常的系统关闭),它将退回到扫描状态(速度较慢,但能保证正确,Fastmap在下次启动时将恢复)。

    • 详细信息:Thomas Gleixner的ELCE 2012演讲:

      http://elinux.org/images/a/ab/UBI_Fastmap.pdf

    使用步骤:

    • 使用CONFIG_UBI_FASTMAP配置编译内核

    • 使用ubi.fm_autoconvert = 1内核参数至少引导一次系统。

    • 以干净的方式重启系统

    • 保证如上启动一次后可以删除ubi.fm_autoconvert = 1


    UBI Fastmap性能测试举例:

    • 在Linux 3.10的Microchip SAMA5D3 Xplained板(ARM)上测得

    • UBI空间:216 MB

    • 根文件系统:已使用80 MB(Yocto)

    • 平均加载时间:

      • 无UBI Fastmap,加载时间:968ms

      • 有UBI Fastmap,加载时间:238 ms

        可见UBI Fastmap 改善非常显著!

     

    1.6. ubiblock + SquashFS

    对RAW Flash :

    • ubiblock:位于UBI顶部的只读块设备

      利用CONFIG_MTD_UBI_BLOCK配置编译。

    • 允许将SquashFS放在UBI卷上。

    • 引导时间和读取性能不错。非常适合于只读根文件系统。

     

    2. 选取合适的文件系统

    • RAW Flash :带有CONFIG_UBI_FASTMAP的UBIFS可能是最佳解决方案。

    • 块存储:SquashFS是根文件系统的最佳解决方案,它可以是只读的。Btrfs和f2fs可能是读/写文件系统的最佳解决方案。

    • 更改文件系统类型非常容易,并且对应用程序完全透明。只需尝试几个文件系统选项,看看哪个最适合!

    • 不要只关注启动时间。

      对于读写性能至关重要的系统,我们建议使用单独的根文件系统(以加快启动时间)和数据分区(以实现良好的运行时性能)。

       

    2.1 Initramfs
    一个很好的方案是使用非常小的initramfs,以启动关键应用程序,然后切换到最终的根文件系统。

    图片

    initramfs机制:将根文件系统集成到内核映像中,因此它与内核一起被加载到内存中:

    • 它将文件系统的压缩存档集成到内核映像中

    • 变种:压缩的initramfs固件也可以由bootloader单独加载。

    initramfs在下面两种情况下非常有用:

    • 快速启动且非常小的根文件系统。由于文件系统在启动时已完全加载,因此应用程序启动也非常快。

    • 作为切换到实际根文件系统之前的中间步骤,该文件位于需要其驱动程序不属于内核映像的设备(存储驱动程序,文件系统驱动程序,网络驱动程序)上。始终在桌面/服务器发行版的内核上使用此选项,以保持内核映像大小合理。

     

    2.2 内存中的initramfs

    图片

    • 使用CONFIG_INITRAMFS_SOURCE选项在内核配置级别定义initramfs的内容

      • 可以是包含根文件系统内容的目录的路径

      • 可以是cpio归档文件的路径

      • 可以是描述initramfs内容的文本文件

    • 内核构建过程将自动获取CONFIG_INITRAMFS_SOURCE选项配置的内容,并将根文件系统集成到内核映像中

    • 详细信息(在内核源文件中):

      Documentation/filesystems/ramfs-rootfs-initramfs.txt

      Documentation/early-userspace/README

     

    2.3 用initramfs启动过程

    图片

    2.4 initramfs 降低启动时间

    创建尽可能小的最小初始化文件,足以启动关键应用程序,然后使用switch_root切换到最终根文件系统:

    • 使用轻量级的C库以减小固件大小,建议使用uClibc。

    • 将BusyBox裁剪到最小。甚至可以不用BusyBox直接在C中实现/init。

    • 使用静态链接的应用程序(较少的CPU开销,较少的库加载,较小的initramfs(如果根本没有库))。Buildroot中用BR2_STATIC_LIBS配置。


    2.5 静态链接可执行文件

    • 静态链接的可执行文件对于减小大小(特别是在小型initramfs中)非常有用,并且启动工作量较少。

    • 如果您将initramfs放在压缩的内核映像中,请不要对其进行压缩(启用CONFIG_INITRAMFS_COMPRESSION_NONE)。

    • 否则默认情况下,您的initramfs数据将被压缩两次,内核将更大,并且将花费更多的时间来加载和解压缩。

    • 在Linux 5.1上的示例在Beagle Bone Black上具有1.60 MB的initramfs(tar存档大小):这可以将内核大小从4.94 MB减少到4.74 MB(-200 KB),并节省大约170毫秒的启动时间。

     

    03 内核

    1.有用的调试手段

    1. 1 内核初始化度量函数

    要找出最长执行时间的内核初始化函数,请在内核命令行中添加initcall_debug。将内核日志中得到如下日志:

    图片

    如使用initcall_debug可能需要在内核配置中使用CONFIG_LOG_BUF_SHIFT增加日志缓冲区的大小。还可能需要使能CONFIG_PRINTK_TIME和CONFIG_KALLSYMS。

     

    1.2 使用内核启动图进行有目的的优化

    使用initcall_debug可以生成启动图,从而轻松查看哪些内核初始化函数需要最多时间来执行。

    • 复制dmesg命令的输出并将其粘贴到文件中(我们将其称为启动日志boot.log)

    • 在开发工作站上,在内核源代码中运行scripts / bootgraph.pl脚本:scripts / bootgraph.pl boot.log> boot.svg

    • 现在可以使用矢量图形编辑器(例如inkscape)打开启动图:

    图片

    首先从花费最长时间的功能开始尝试优化。对于每个功能:

    • 在内核源代码中查找其定义。

      可以使用Elixir(参考https://elixir.bootlin.com)。

    • 注意:某些函数名称可能不存在,名称与modulename_init相对应。然后,在相应的模块中查找初始化代码。

    • 删除不必要的功能:

    • 通过查看相应源目录中的Makefile,找到哪个内核配置参数可编译代码。

    • 延后加载处理:

      • 查找功能所属的模块(如果有)。如果可能,请稍后加载此模块。

    • 优化必要的功能:

      • 查找可以用于减少探测时间的参数,并查找module_param宏。

      • 查找延迟循环和对名称中包含delay的函数的调用, 可以减少此类延迟,并查看代码是否仍然有效。

     

    1.3 减小内核尺寸

    首先,我们专注于在不删除功能的情况下缩小尺寸

    • 主要机制是使用内核模块

    • 将启动时不需要的所有内容编译为模块

    • 有两个好处:内核更小且加载速度更快,初始化代码更少

    • 删除用户空间不需要的功能:

      CONFIG_KALLSYMS,CONFIG_DEBUG_FS,CONFIG_BUG

    • 用专为嵌入式系统设计的功能:CONFIG_SLOB,CONFIG_EMBEDDED

     

    然后考虑内核压缩的方式:

    根据存储读取速度和CPU解压缩内核之间的平衡,需要对不同的压缩算法进行测试。还建议在内核优化过程结束时尝试压缩选项,因为结果可能会因内核大小而异。

    图片

    在基于TI AM335x (ARM), 1 GHz, Linux 5.1测试:

     gziplzmaxzlzolz4
    大小2350336 1777000172012025338722716752
    拷贝0.208 s    0.158 s0.154 s0.224 s0.241 s
    启动时间1.451 s    2.167 s1.999s1.416 s1.462 s

    Lzo和Gzip似乎是最好的解决方案。 但这结果取决于存储和CPU性能,故在决定方案是务必进行测试。

     

    另外内核的编译选项也有可以优化的可能:

    • CONFIG_CC_OPTIMIZE_FOR_SIZE:可以使用gcc -Os而不是gcc -O2编译内核。

    • 这样的优化会优先考虑代码大小,但会牺牲代码速度。

    • 结果:初始引导时间更好(较小的启动时间),但是较慢的内核代码可能会使性能降低。系统运行速度会变慢!

     

    1.4 延迟驱动程序和初始化调用

    如果有点功能无法编译为模块(例如,网络或模块子系统),可以尝试推迟执行。内核不会缩小,但某些初始化将被推迟,所以启动变快。通常,您可以修改probe()函数以返回-EPROBE_DEFER,直到它们准备好运行为止。

    有关支持此功能的详细信息,请参见

    https://lwn.net/Articles/485194/。

     

    1.5 关闭控制台输出

    控制台输出实际上要花费很多时间(非常慢的设备)。 产品中可能不需要。通过在内核命令行中传递quiet参数来禁用它。但仍然可以使用dmesg获取内核消息。这一步一般建议等最后一步再做,否则将损失控制台进行调试。

     

    1.6 预置jiffy

    每次引导时,Linux内核都会校准延迟循环(用于udelay()函数)。这将测量每个jiff y(lpj)值的循环次数。只需要测量一次!在内核启动消息中找到 lpj值:

    Calibrating delay loop... 996.14 BogoMIPS (lpj=4980736)

    然后将lpj = <value>添加到内核命令行:

    Calibrating delay loop (skipped) preset value.. 996.14 BogoMIPS (lpj=4980736)

     

    1.7 多处理器

    SMP初始化很慢,即使您只有一个核心CPU,通常也会在默认配置中启用它(默认配置应支持多个系统)。因此,如果只有一个CPU内核,请确保将其禁用。BeagleBone Black上的结果:压缩内核大小:-188 KB

     

    要节省最后的毫秒数,您可能需要删除不必要的功能:

    • CONFIG_PRINTK = n与quiet命令行参数具有相同的效果,但是您无权访问内核消息。但是,您将拥有一个非常小的内核。

    • 在Thumb2模式下编译内核:CONFIG_THUMB2_KERNEL(任何ARM工具链都可以做到)。

    • 模块装卸

    • 块层(Block layer)

    • 网络堆栈

    • USB堆栈

    • 电源管理功能

    • CONFIG_SYSFS_DEPRECATED

    • 输入:键盘/鼠标/触摸屏

    • 减少CONFIG_LEGACY_PTY_COUNT的值或设置pty.legacy_count内核参数

     

    04 启动脚本

    1.优化初始化脚本和系统启动

    有多种方法可以减少启动应用程序之前执行启动脚本中花费的时间:

    • 仅在启动必要的依赖项之后,尽快启动应用程序。

    • 简化shell脚本

    • 可以尝试执行启动脚本之前启动应用程序

    1.1.bootchart

    如果想更详细地了解用户区的引导顺序,则可以使用使用grabserial中的bootchart来实现,例如:

    图片

    那么如何配置并使用bootchart 呢?

    • 在busybox中配置使用bootchartd(CONFIG_BOOTCHARTD = y)

    • 通过命令行init = / sbin / bootchartd 引导您的开发板

    • 将/var/log/bootlog.tgz从目标复制到开发主机

    • 生成时间表:

      cd bootchart-<version>

      java -jar bootchart.jar bootlog.tgz

      bootchart 参见 http://www.bootchart.org

     

    1.2. systemd

    如果将systemd用作初始化程序,则可以使用systemd-analyze。 

    http://www.freedesktop.org/software/systemd/man/systemd-analyze.html

    图片

    1.3. init 进程

    在所有依赖项启动之后,应尽快启动:

    • 取决于您的init进程。在这里,我们假设使用sysV init脚本。

    • init脚本按字母数字顺序运行,并以字母开头(K表示停止(杀死),S表示开始)。

    • 将应用程序启动脚本使用最小的号码。

    • 甚至可以用应用程序替换init!如果可以成为第一个启动的应用程序,启动速度无疑大大加快!

    • 直接通过一个启动脚本启动所有服务(例如/etc/init.d/rcS)。这消除了对/ bin / sh的多次调用。

    • 甚至可以直接在应用程序的C代码中挂载文件系统:如

    图片

     

    1.4 减少fork的使用

    • fork/exec系统调用开销很大。故从Shell调用可执行文件的速度很慢。

    • 即使BusyBox实现的shell中echo也会导致fork 系统调用!

    • 在BusyBox配置中选择Shells-> Standalone shell,以使Shell尽可能调用小程序。

    • 管道和反引号也由fork/exec实现。应减少它们在脚本中的使用。例:

      cat /proc/cpuinfo | grep model

      应修改为:

      grep model /proc/cpuinfo

      更详细,请参考:

      http://elinux.org/Optimize_RC_Scripts

       

      又例如:

      图片

      应做如下修改更佳:

      图片

      仅此一项优化就可以在ARM AT91SAM9263系统(200MHz)上节省87毫秒!

    1.5 减小固件的尺寸

    • 剥离可执行文件和库,删除仅用于开发和调试的ELF部分。strip命令由交叉编译工具链提供。默认情况下在Buildroot中完成的。

    • superstrip超级剥离

      http://muppetlabs.com/~breadbox/software/elfkickers.html。

      使用strip可以剥离出Linux未用于启动可执行文件的更多位。Buildroot停止支持它,因为它可能破坏可执行文件。 仅在保存一些字节至关重要时才尝试。

    • 还可以尝试https://packages.debian.org/sid/mklibs上提供的mklibs:

       

       mklibs产生精简的共享库,其中仅包含一组特定的可执行文件所需的例程。对于像OpenGL和QT这样的大型库确实很有用。它甚至可以在没有源代码的情况下工作。

      在Yocto中可用,但在Buildroot中不可用(2019.02状态)。

       限制:mklibs可以删除倾斜的库(由应用程序“手动”加载),因为它看不到它们

     

    3.5.5 快速启动画面显示

    • 可以使用fbv显示启动画面,

      http://freshmeat.sourceforge.net/projects/fbv

    • 使用armel,可以只使用我们的静态编译二进制文件:

      https://github.com/bootlin/static-binaries/tree/master/fbv/

    • 但是在MicrochipAT91SAM9263系统上很慢为878毫秒!

    • 为了更快地执行此操作,可以转储帧缓冲区framebuffer中的内容:

      fbv -d 1/root/logo.bmp

      cp /dev/fb0/root/logo.fb

      lzop -9/root/logo.fb

    •  然后尽早在initramfs中将其复制回:

      lzopcat/root/logo.fb.lzo > /dev/fb0


     

    05 Bootloader

    1. 裁剪

    • 删除不必要的功能。

      通常引导加载程序包括许多仅用于开发所需的功能。用较少的功能编译您的bootloader。

    • 优化所需的功能。调整引导加载程序以获得最快的性能。

     

    U-Boot是事实上的嵌入式bootloader标准,对于U-Boot而言,以下一些功能在产品中可能不需要:

    • 在include / configs / <soc>-<board> .h中禁用尽可能多的功能

    • 示例:MMC,USB,以太网,dhcp,ping,命令行版本,命令完成提示...

    • 较小且更简单的U-Boot加载速度更快,初始化速度更快。

    • 移除启动延时:

      • 消除启动延迟,这样通常可以节省几秒钟!:

        setenv引导延迟0

      • 在执行此操作之前,请先使用

        CONFIG_ZERO_BOOTDELAY_CHECK重新编译U-Boot,

        参考文档在doc / README.autoboot中。即使启动延迟设置为0,它也可以通过敲键来停止自动启动过程。

     

    2. 简化脚本

    有些情况,脚本很复杂,如:

    图片

    可以修改为:

    图片

    在ARM9(400MHz)可节省大约56ms

     

    3. 拷贝准确大小的内核

    • 将内核从ROM复制到RAM时,仍然看到许多系统复制了太多无用字节,而没有考虑确切的内核大小。

    • 在U-Boot中,使用nboot命令:

      nboot ramaddr 0 nandoffset

    • U-Boot使用存储在uImage标头中的内核大小信息来知道要复制多少字节。

     

    4. 优化内核加载

    将内核uImage复制到RAM之后,U-Boot始终将其移动到uImage标头中指定的加载地址。还执行CRC检查。

    • 可以通过将uImage直接加载到正确的地址来使U-Boot跳过memmove操作。

    • 计算此地址:

      Addr = Load Address - uImage header size

      Addr = Load Address - (size(uImage) - size(zImage))

      Addr = 0x20008000 - 0x40 = 0x20007fc0

    • 在生产中时数据一般不会损坏将内核复制到RAM时,可以考虑禁用CRC检查

    • 禁用带有U-boot环境变量的CRC检查:

      setenv verify no

    • 关闭U-Boot控制台输出。需要使用以下命令编译U-Boot

      CONFIG_SILENT_CONSOLE和setenv silent yes.

      有关详细信息,请参见doc / README.silent。

     

    5. 跳过bootloader直接启动内核

    • 原理:立即加载内核,而不是先加载引导加载程序,再加载内核!

    • 例如在Microchip AT91上,使用at91bootstrap v3即可轻松实现。
      您只需要使用linux或linux_dt配置之一进行配置:

      make at91sama5d3xeknf_linux_dt_defconfig

      make

    对于 U-Boot Falcon 模式:

    • U-Boot分为两部分:SPL(二级程序加载程序)和U-Boot映像。 然后,U-Boot可以配置SPL来直接加载Linux内核,而不是U-Boot映像。

    • 有关详细信息,请参见doc / README.falcon和

      http://schedule2012.rmll.info/IMG/pdf/LSM2012_UbootFalconMode_Babic.pdf进行原始演示。

    • 所有支持SPL的U-Boot板上均以相同的方式支持此功能。

    展开全文
  • Windowstime服务用于将系统时间与Internet同步. 如果时间无法同步,则​​原因可能是该...如果在启动服务时提示您: “错误1058: 无法启动该服务xp时间同步出错,则可能是与该设备关联的设备尚未启动. ”原因: Win...

    20170823101450603.jpg.jpg

    Windowstime服务用于将系统时间与Internet同步. 如果时间无法同步,则​​原因可能是该服务未从系统启动. 您可以在“运行”处输入“ services.msc”以打开服务控制台并找到“ windowstime”服务项,在其属性中,启动类型设置为自动并启动.

    如果在启动服务时提示您: “错误1058: 无法启动该服务xp时间同步出错,则可能是与该设备关联的设备尚未启动. ”

    原因: Windows时间服务无效.

    修复:

    1. 运行cmd进入命令行,然后运行以下命令: w32tm / register

    正确的响应是: W32Time成功注册.

    如果系统提示您w32tm命令不是内部命令还是外部命令...,因为系统磁盘下的system32目录没有两个文件w32tm.exe和w32time.dll,请从Internet上下载一个文件或将其复制到另一台计算机的相应目录中. 将这两个文件放在此目录下,然后再次运行.

    附加: w32tm.exe网络下载地址:

    2. 如果上一步是正确的,请在cmd命令行中使用net start“ windows time”或net startw32time或运行以启动服务.

    如果无法启动WindowsTime服务,它还会提示: 系统提示“错误1083: 配置为在可执行程序中运行的服务无法执行该服务.

    原因分析:

    此故障通常发生在svchost服务主机进程启动的服务上. 每个人都知道Windows XPSP2最多可以启动七个svchost流程实例(实际上是启动六个流程实例),这些实例负责启动一组服务. 每个svchost实例负责启动的服务由以册表项确定:

    HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ WindowsNT \ CurrentVersion \ SvcHost

    通常有七个子项: DcomLaunch,HTTPFilter,imgsvc,LocalService,netsvcs,NetworkService,dot3svc和termvcs. 每个键值定义一个或多个服务,即可以为svchost进程的每个实例启动的一组服务.

    在此示例中,“ WindowsTime”服务的可执行程序参数为“ svchost.exe -knetsvcs”. 在启动服务之前,如果netsvcs键值中有服务的定义,则相应的svchost进程将首先转到“查找”. 否则,将出现故障现象.

    解决方案:

    首先打开服务的属性对话框,检查执行的服务名称w32time(不是显示名称WindowsTime),然后复制服务名称(w32time),如图所示:

    0b5761475c496671b3abe6b9da8cef24.png

    复制服务名称(W32Time),启动-运行-输入regedit并确认(打开注册表编辑器),找到HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ WindowsNT \ CurrentVersion \ SvcHost,单击“ SvcHost”项,在右键,找到相应的键值netsvcs(键值netsvcs是从服务属性C: \ windows \ system32 \ svchost.exe -knetsvcs中的可执行文件的路径获得的),然后右键单击并选择Modify(M). )在“编辑多字符串”框中,在“值数据(V)”的最后一行中添加服务名称(w32time),然后单击“确定”,如下图所示:

    重新启动计算机并启动服务(Windows时间).

    实际上,当启动其他服务时,也会以相同方式修复1083错误

    参考本文: si = 1

    附件: 相关知识:

    每个人都知道计算机时间是由电池来维持的,而当时间不准确时,准确性往往很差. 通过Internet上发布的一些公共网络时间服务器NTPserver,可以实现本地标准时间的自动,定期同步. 因此,时间同步可能是服务器地址的问题. 您可以复制以下文本,创建一个新的文本文件并将其另存为reg文件,然后双击以导入注册表.

    Windows注册表编辑器5.00版

    [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ DateTime \服务器]

    @ =“ 6”

    “ 1” =“ time.windows.com”

    “ 2” =“ time.nist.gov”

    “ 3” =“ time-nw.nist.gov”

    “ 4” =“ time-a.nist.gov”

    “ 5” =“ time-b.nist.gov”

    “ 6” =“ 210.72.145.44”

    或双击系统托盘下的时间,在服务器地址栏中输入国家时间服务中心服务器的IP地址(210.72.145.44),然后单击“确定”按钮进行保存.

    附加:

    160a122fd3a09ce5f1b6568411f956e0.png

    C: \ Documents and Settings \ Administrator> w32tm /?

    w32tm [/? | /注册| /注销)

    ?-此帮助屏幕.

    register-注册以作为服务运行,并将默认配置添加到注册表中.

    取消注册-取消注册服务并从注册表中删除所有配置信息.

    w32tm /监视器[/域: ]

    [/计算机: [,[,...]]]

    [/线程: ]

    domain-指定要监视的域. 如果未指定域名,或者未指定域或计算机选项,则将使用默认域. 此选项可以多次使用.

    computers-监视给定的计算机列表. 计算机名称用逗号分隔,没有空格. 如果名称带有前缀“ *”,它将被视为PDC. 此选项可以多次使用

    使用.

    threads-同时分析的计算机数. 默认值为3. 允许的范围是1-50.

    w32tm / ntte

    将NT系统时间从(0 ^ -7)s间隔中的0h 1-Jan1601转换为可读格式.

    w32tm / ntpte

    将NTP时间从(2 ^ -32)s间隔中的0h 1-Jan1900转换为可读格式.

    w32tm /重新同步[/计算机: ] [/ nowait] [/重新发现] [/软]

    3ed7eb25249a5f66ee73b397423c6f78.png

    告诉计算机应尽快同步其时钟,并丢弃所有累积的错误统计信息.

    计算机: -需要重新同步的计算机. 如果未指定,则本地计算机将重新同步.

    nowait-不等待重新同步发生;立即返回. 否则,请等待重新同步完成,然后再返回.

    rediscover-重新检测网络配置并重新发现网络资源,然后重新同步

    使用现有错误统计信息进行

    soft-Resync. 无用,出于兼容性考虑.

    w32tm /条形图/计算机: [/期间: ]

    [/仅数据] [/样本: ]

    条形图显示此计算机与另一台计算机之间的偏移量.

    计算机: -要测量其偏移量的计算机.

    期间: -示例之间的时间间隔,以秒为单位. 默认值为2秒

    仅数据显示数据,不显示图表.

    samples: -收集样本并停止. 如果未指定,将一直收集样本,直到按Ctrl-C为止.

    w32tm /配置[/计算机: ] [/更新]

    [/ manualpeerlist: ] [/ syncfromflags: ]

    [/ LocalClockDispersion: ]

    计算机: -调整配置. 如果未指定,则默认值为本地计算机.

    f4b506c0abd659f5a544d059e1b869c5.png

    更新-通知服务配置已更改的时间xp时间同步出错,以使更改生效.

    manualpeerlist: -将手动对等列表设置为DNS和/或IP地址的空格分隔列表.

    指定多个对等方时,必须将开关用引号引起来.

    syncfromflags: -设置NTP客户端将从其进行同步的源. 应该是这些关键字的逗号分隔列表(不区分大小写):

    MANUAL-从手动对等方列表中包括对等方

    域级DC的DOMHIER同步

    w32tm / tz

    显示当前时区设置.

    w32tm / dumpreg [/子项: ] [/计算机: ]

    显示与给定注册密钥关联的值.

    默认密钥为HKLM \ System \ CurrentControlSet \ Services \ W32Time(时间服务的根密钥).

    子键: -显示与默认键的子键关联的值.

    计算机: -查询计算机的注册表设置

    修改时间同步间隔:

    [HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ W32Time \ TimeProviders \ NtpClient]

    “已启用” = dword: 00000001

    “ SpecialPollInterval” = dword: 0000a8c0

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/jisuanjixue/article-198463-1.html

    展开全文
  • SQL Server数据库附加失败的解决办法本文为大家分享了SQL Server数据库附加失败的具体解决方法,供大家参考,具体内容如下1、错误3415问题:附加数据库的时候,发现总是附加失败,查看消息时发现问题如下: 查看消息...

    SQL Server数据库附加失败的解决办法

    本文为大家分享了SQL Server数据库附加失败的具体解决方法,供大家参考,具体内容如下

    1、错误3415

    问题:附加数据库的时候,发现总是附加失败,查看消息时发现问题如下:

    65e2e59687ef6e6601250ecfffcbecf2.png 查看消息后发现错误代码为3415 原因:数据库文件是只读的 解决方法:在文件属性中去掉只读属性

    2、错误5120

    问题:解决完错误3415后,附加数据库还是出现错误,查看消息时发现问题如下:

    2018032216535765.png 查看消息后发现错误代码为5120 解决方法1(尝试):把数据库登陆方式改为Windows身份认证,然后再试一下; 解决方法2:查看一下数据库文件的属性->安全标签,发现

    4e73463831d26569cc124351cecd0ce4.png

    此处应该添加一个Everyone的用户组

    5e0b073037f52e1893c4de006c479d43.png

    然后赋予完全控制的权限

    b7e4a261e42f75e3b31c1a55081c67b0.png

    再次附加就可以成功。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

    时间: 2018-03-22

    6b5aa0751a6f1e6a9d0b665a02cc1f46.png

    问题描述: 附加数据时,提示无法打开物理文件,操作系统错误5.如下图: 问题原因:可能是文件访问权限方面的问题. 解决方案:找到数据库的mdf和ldf文件,赋予权限即可.如下图: 找到mdf和ldf文件,本演示以ldf为例. 1.点击文件右键属性-->安全-->编辑 2.编辑-->添加 3.添加-->高级 4.高级-->立即查找-->搜索结果中找到-->Everyone-->确定-->确定 5.确定-->默认选中的Everyone用户-->

    6b5aa0751a6f1e6a9d0b665a02cc1f46.png

    在一些朋友安装完SQL Server 2008之后大多会遇到连接出错的问题.特别对于我们这样的新手而言简直郁闷的要死,好不容易装玩了又出现了问题.此篇文章意在解决安装步骤没有问题,但安装后无法登录的问题. 在解决问题之前请朋友们打开服务窗口,看"SQL Server"主服务是否打开,如下图. 若服务已经打开还是用"SQL Server 身份验证"和"Windows 身份验证"都无法登录请看下面的步骤. 往往这时,服务器类型我们选择了"数

    SQLSTATE SQL SERVER 驱动程序错误 描述  HY000 所有绑定列都是只读的. 必须是可升级的列,以使用 SQLSetPos 或 SQLBulkOperations 更改或插入行. HY000 已检测到一个旧 netlib (%s).请删除并重新启动应用程序. 正在装载的 netlib 已过期.驱动程序请求一个较新的 netlib.问题可能出在应用程序当前目录中的 netlib,正在装载的是这个 netlib,而不是系统目录中的那个.也可能是该 netlib 安装不当或已损坏.

    在安装好了MySQL之后,使用了新的配置文件后,MySQL服务器可以成功启动,但在登陆的时候出现了ERROR 2002 (HY000): Can't connect to local MySQL server through socket,即无法通过socket连接到mysql服务器,同时提供了socket文件的位置.下面是这个问题的描述与解决办法. 1.故障现象 复制代码 代码如下: [root@SZDB mysqldata]# mysql -uroot -p123456 Warning: U

    6b5aa0751a6f1e6a9d0b665a02cc1f46.png

    SQL Server 2005附加数据库文件时出现了Read-Only错误,附加的时候,系统提示mdf文件为只读,可是打开文件属性,这个属性不为只读.该怎么解决呢?本文我们就介绍了这一解决方案,接下来就让我们来一起了解一下吧. 两种解决方法如下: 1.重新打开数据库软件,在登录认证框那里选择:Windows authentication进行登录.然后再附加数据库,这时附加的就没有Read-Only了. 2.在*.mdf文件的属性里,找到"安全"页,然后把里面所有的"组或用户名

    6b5aa0751a6f1e6a9d0b665a02cc1f46.png

    可能由于操作系统不同,或者在安装SQL 2008的时候已经安装SQL其他版本,因此可能会遇到问题,那么这时我们的实际经验和动手测试的能力也是非常重要的,这样才能少走弯路. 问题1:安装sql server 2008 R2,安装过程中提示错误:此计算机上安装了 Microsoft Visual Studio 2008 的早期版本.请在安装 SQL Server 2008 前将 Microsoft Visual Studio 2008 升级到 SP1. 之前我的电脑上确实装了vs2008,于是我准

    附加数据库出错: 无法打开物理文件 "XXXXXXXXXXXXX".操作系统错误 5:"5(拒绝访问.)". (Microsoft SQL Server,错误: 5120) 解决方法:目录(即文件夹)权限不够,将SQLServer2005MSSQLUser$计算机名$MSSQLSERVER用户组加入,改为完全控制,注意一定要是完全控制才可以.

    6b5aa0751a6f1e6a9d0b665a02cc1f46.png

    今早开机发现,打开SQL Server 2008 的 SQL Server Management Studio,输入sa的密码发现,无法登陆数据库?提示以下错误: "在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)" 在网上看到他人说使用将服务器(local

    6b5aa0751a6f1e6a9d0b665a02cc1f46.png

    今天在附件一个以前的数据库(没有在SqlServer初始安装的目录下)的时候,老是附加不上,总是出现5123的错误代码,如图: 一开始以为是SqlServer2008不兼容原来的数据库所致,因为这个数据库是不知道当时是那个版本创建的,在官方看了一下,解释说权限不对,应该把这个数据库放到SqlServer安装的目录下,也就是X:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA,果然解决问题:不过总不能每次都把数据库

    6b5aa0751a6f1e6a9d0b665a02cc1f46.png

    最近几天从网上找了几个asp.net的登录案例想要研究研究代码,结果在用Sql Server2005附加数据库文件时弹出错误信息: 看到网友回复说:只需给Authenticated Users赋所有权限就行了. 本人也遇到类似的问题,但是解决方法很简单,只需要使用管理员的身份打开SQL Server Management Studio,即可附加数据库了 如下图:  ,一时无解,遂求助于百度谷歌,经过各种试验,特将解决办法整理于此,希望能帮到大家,同时如果有好的意见大家多多交流啊! 方案一:切换登

    问题1:尝试打开或创建物理文件 'E:\Library.mdf' 时,CREATE FILE 遇到操作系统错误 5(拒绝访问.). 最佳回答: 这是因为SQL Server的启动帐户(一般是system或某个操作系统管理员),对E盘根目录没有创建文件的权限.右击E盘,在属性里查看"安全"选项卡里查看用户的权限.查看启动帐户是谁,运行services.msc,在服务管理器里找到SQL Server服务,然后看"登录"选项卡. 本人补充发现,是权限的问题..->任

    20111101210027944.png

    错误载图 解决方法: 1.直接把己有数据库复制到sql安装目录下C:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA 这样就可以附加,不知道是不是在装数据库时漏选了什么操作,以前没遇到过. 2.在己有数据库mdf和ldf文件上, 右键---->属性---->添加---->高级---->立即查找---->Authenticated Users---->确定 ------>完全控制勾上

    Mysql的utf8编码最多3个字节,而Emoji表情或者某些特殊字符是4个字节. 因此会导致带有表情的昵称插入数据库时出错. 只要修改MySQL的编码即可,解决方案如下: 1.在mysql的安装目录下找到my.ini,作如下修改: [mysqld] character-set-server=utf8mb4 [mysql] default-character-set=utf8mb4 2 重启mysql服务 3 修改表 ALTER TABLE 表名 CONVERT TO CHARACTER SET

    748e31c43a68626ffe568e54298214cf.png

    本文实例讲述了Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法.分享给大家供大家参考,具体如下: ①在项目根目录放置.env文件 .env APP_NAME=Laravel APP_ENV=local APP_KEY= APP_DEBUG=true APP_LOG_LEVEL=debug APP_URL=http://localhost DB_CONNECTION=mysql

    9708c69c9c8b0462a8519d39b3b1db27.png

    今天打开网站突然发现网站无法打开,后来通过SSH登陆服务器发现MARIADB数据库没有启动成功,再次启动还是无法成功启动,一直处于启动进度条,进度条结束后提示ERROR.查看日志出现以下错误: InnoDB: Unable to lock ./ibdata1, error: 11 后经调试发现是因为MariaDB数据库所在分区已经满了,造成无法启动. 只有将MariaDB数据库存放数据目录移动到另外一个磁盘份额比较大的分区或者将当前分配删除一些不必要的文件. 移动办法: 1.停掉mysql服务器

    问题描述: 图片加载后显示,然后进行删除操作时提示"--正由另一进程使用,因此该进程无法访问该文件.--" 解决办法: 原代码: 复制代码 代码如下: iml.Images.Add(Image.FromFile(potopath + "\\" + fi.Name)); 改为: 复制代码 代码如下: Image img = Image.FromFile(potopath + "\\" + fi.Name);  iml.Images.Add(img)

    8cd4ce8845eb48abb7772acccd7e95ad.png

    数据库复制: 简单来说,数据库复制就是由两台服务器,主服务器和备份服务器,主服务器修改后,备份服务器自动修改. 复制的模式有两种:推送模式和请求模式,推送模式是主服务器修改后,自动发给备份服务器,请求模式是,备份服务器自动去请求,个人开始也比较重视去测试两个模式的差别,但是测试发现,其实两个模式差别不是很大,在当今的服务器配置中,没必要考虑这么多,虽然会有一些差别,但是可在可以忽略的范围之内,建议直接选择推送模式,因为配置起来相对简单 数据库发布类型有三种:快照发布,事务性发布,具有可更新订阅和

    官网中关于ORA-12560的解释: ORA-12560: TNS:protocol adapter error Cause: A generic protocol adapter error occurred. Action: Check addresses used for proper protocol specification. Before reporting this error, look at the error stack and check for lower level

    展开全文
  • 优化嵌入式Linux的启动时间之文件系统 注:本文转载自微信公众号嵌入式客栈——优化嵌入式Linux的启动时间之文件系统 原创逸珺嵌入式客栈2020-03-02 导读:嵌入式Linux在应用中往往希望系统能在尽量短的时间内...
  • Oracle 如何附加数据库

    2021-05-04 05:36:56
    前提:从别的计算机得到一份数据库目的:把数据库里面的数据附加到本地数据库,从而可以查看数据库中的数据,取之应用.必须了解信息:原数据库全局数据库名称:oracle,SID:ORCL.原数据库存放路径:E:\oracle\oracdata\本地...
  • Android应用启动优化

    2021-01-11 11:10:24
    应用启动时间 用户希望应用能够及时响应并快速加载。启动时间过长的应用不能满足这个期望,并且可能会令用户失望。这种糟糕的体验可能会导致用户在 Play 商店针对您的应用给出很低的评分,甚至完全弃用您的应用。 本...
  • 开机启动

    2021-03-18 10:25:59
    启动项目就是开机的时候系统会在前台或者后台运行的程序】当Windows(操作系统)完成登录过程,进程表中出现了很多的进程!Windows在启动的时候,自动加载了很多程序。许多程序的自启动,给我们带来了很多方便,这是...
  • 分离数据库和附加数据库有什么区别发布时间:2020-04-17 13:47:22来源:亿速云阅读:347作者:小新分离数据库和附加数据库有什么区别?很多人都不太了解,今天小编为了让大家更加了解分离数据库和附加数据库,所以给...
  • 如图: 其实我们打开“Windows Defender安全中心”以后,点击“设备性能和运行状况”,再点击窗口底部“全新启动”下的“附加信息”也可打开上图所示的“全新启动”界面。 微软对“全新启动”的解释是: 让你重新...
  • Linux开机启动流程

    2021-05-09 07:04:09
    linux开机启动详细流程图:一、BIOS 加电自检当你按电源开关开机时,电脑会首先去启动BIOS(基本输入输出系统),BIOS一般是集成在主板上的.BIOS 的工作1.检测连接硬件,比如显卡,内存,磁盘等等,检测的目的是以后把这些...
  • SQL Server 数据库分离与附加图文教程,需要的朋友可以参考一下。一、概述SQL Server提供了“分离/附加”数据库、“备份/还原”数据库、复制数据库等多种数据库的备份和恢复方法。这里介绍一种学习中常用的“分离/...
  • linux开机启动流程

    2021-05-13 14:59:21
    linux开机启动流程:一、BIOS 加电自检当你按电源开关开机时,电脑会首先去启动BIOS(基本输入输出系统),BIOS一般是集成在主板上的.BIOS 的工作1.检测连接硬件,比如显卡,内存,磁盘等等,检测的目的是以后把这些设备信息...
  • 要进行完全重启动,必须执行 EDSTART .3 指定下面的命令应用于完全重启动。例如,假设前面的分析用 Jobname.K 输入文件运行,并且它产生了一个名为 d3dump01 的重启动 dump 文件。用户将执行EDSTART ,3,,,dsdump01...
  • Linux快速启动技巧

    2021-05-17 18:06:25
    只需撤消所有不想启动的服务选项。2.撤消多余的内核模块假如你的桌面连接到以太网,就不需要装载无线内核模块。这是较为困难的任务,可能需要重新编译内核,而编译内核不是可以轻松担当的工作...
  • PS:在个人电脑中,Linux的启动是从0xFFFF0地址开始的。如果你对Linux操作系统有一定的了解,想对其更深层次的东西做进一步探究。这当中就包括系统的启动流程、文件系统的组成结构、基于动态库和静态库的程序在执行时...
  • Linux启动过程详解

    2020-12-20 06:55:24
    这当中就包括系统的启动流程、文件系统的组成结构、基于动态库和静态库的程序在执行时的异同、协议栈的架构和原理、驱动程序的机制等等。本人在综合了现有网上大家智慧的基础上,结合对2.6.32的内核代码的研读,基于...
  • qt程序内部,有时候有个设置选项,就是是否设置开机启动。 下面代码就是实现开机启动设置和取消的功能,具体请看代码: //判断系统是否为64位 bool is64BitSystem() { typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO)...
  • Linux需要重新启动是少有的。可是一旦需要,Linux启动常常是缓慢的。幸好有一些加速的办法。其中一些方法不太难。咱们瞧一瞧吧。方法/步骤#1: 撤消多余的服务根据机器的用途,很多服务是不需要的。要是Linux只用作...
  • 一、BIOS 加电自检当你按电源开关开机时,电脑会首先去启动BIOS(基本输入输出系统),BIOS一般是集成在主板上的.BIOS 的工作1.检测连接硬件,比如显卡,内存,磁盘等等,检测的目的是以后把这些设备信息提供给操作系统2....
  • 教程/服务器启动脚本

    2021-03-10 05:25:58
    警告因为这是Wiki的一个条目,可以在任何时间内被任何人编辑,因此建议你 不要完全使用这个脚本,而是将其当作编写脚本的指导手册看待。这是一个可供参考的 Minecraft 启动脚本示例,并使用 GNU/Linux distros 对...
  • Linux设置程序开机自启动

    千次阅读 2021-05-15 19:47:46
    Linux设置程序开机自启动大致有三种方法。一、通过rc.local设置自启动通过在/etc/rc.local的文件夹下添加shell指令即可在开机时自动启动指令。其内容的格式举例如下:#!/bin/shsudo mkdir /test该例子便是在开机时在...
  • 一、概述SQL Server提供了“分离/附加”数据库、“备份/还原”数据库、复制数据库等多种数据库的备份和恢复方法。这里介绍一种学习中常用的“分离/附加”方法,类似于大家熟悉的“文件拷贝”方法,即把数据库文件(....
  • linux下启动mysql的命令

    2021-02-08 04:45:14
    linux下启动mysql的命令一、总结一下:1.linux下启动mysql的命令:mysqladmin start/ect/init.d/mysql start (前面为mysql的安装路径)2.linux下重启mysql的命令:mysqladmin restart/ect/init.d/mysql restart (前面...
  • 在有些时候我们的电脑硬盘启动不了,这该怎么办呢?下面就由学习啦小编来为你们简单的介绍电脑硬盘启动不了的原因及解决方法吧!希望你们喜欢!电脑硬盘启动不了的解决方法一:如果你的硬盘是SATA和IDE只用一颗IDE数据...
  • 只需撤消所有不想启动的服务选项。2.撤消多余的内核模块假如你的桌面连接到以太网,就不需要装载无线内核模块。这是较为困难的任务,可能需要重新编译内核,而编译内核不是可以轻松担当的工作...
  • jps(JVM Process Status Tool):JVM机进程状况工具用来查看基于HotSpot JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。与unix上的ps类似,用来显示本地有权限的java进程,可以查看本地运行着几个java...
  • timeout=120 启动aria2 sudo aria2c --conf-path=/usr/customer/aria2/aria2.conf 如果没有提示错误,按ctrl+c停止运行命令,转为后台运行: sudo aria2c --conf-path=/usr/customer/aria2/aria2.conf -D 参数使用 ...
  • 一 springboot启动原理及相关流程概览 二 springboot的启动类入口 三 单单是SpringBootApplication接口用到了这些注解  1)@Configuration注解  2)@ComponentScan注解 3)@EnableAutoConfiguration ...
  • Android服务无法启动(Android service would't start)我正在尝试在Android中实现简单的服务,但我无法统计基本服务。这是我的主要课程:import java.io.IOException;import java.net.InetAddress;import java.net....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 156,282
精华内容 62,512
关键字:

启动附加时间