大则几百兆的 .NET Framework,为了防止公司的服务

2019-07-17 作者:小鱼儿玄机30码姐妹   |   浏览(186)

怎么快速搞定 .NET Core 程序的跨平台独立发布,

故障诊断 | 系统级追踪诊断方法及案例分享,故障诊断案例

点击上方蓝色文字关注↑↑↑↑↑

所谓操作系统,是应用程序与服务器硬件进行沟通的中间层。应用程序的所有操作,都是和操作系统进行沟通交互。操作系统负责将所有交互转化为设备语言,进行硬件交互。

我们在进行Oracle故障调试和内核原理工作的时候,经常需要了解后台运行的动作和细节。一些故障场景,如ORACLE后台进展慢、程序无法启动、无法登陆、相同环境执行结果却大不相同等问题,就需要操作系统级别监控,检查定位问题。

Oracle自身已经提供了很多这类型的工具,如oradebug、各种等待事件和跟踪方式。此外,各类型的操作系统提供出很多系统级别工具,帮助我们进行监控。

 

我们先来看一个简单的示例:

LGWR进程写 online redo log是否用到缓存?

这里的这个缓存不是指数据库缓存,操作系统的文件缓存,如果对这个问题不明白,我们先看另外一个问题,我们如果怀疑存储有问题,经常会使用DD命令对磁盘进行测试,相关命令如下所示,那这个命令对磁盘的操作是直接写磁盘还是把数据写到文件缓存里去?

我们来实地进行测试验证看一下,这是在我电脑虚拟机上的一个测试结果,DD了2G的文件,花了4.99秒的时间,实际上这个命令结束的时候数据没真正写到磁盘上去,对于磁盘的写到缓存就返回了。我们另外看一条命令

这里加了一个标志,就是ofag=sync,加完这个标示之后,我们发现写磁盘的速度下降了,写2G的文件花了8秒,多用了60%的时间。这就是文件系统缓存的作用,文件系统缓存大大增加了主机的性能。

我们现在回到之前那个问题,LGWR进程写redo log 会不会用到缓存呢?我们使用strace –p命令来跟踪LGWR进程,为方便观察我们添加一组新的redo日志组并进行切换。

通过分析TRACE信息我们发现,LGWR进程对online redo log打开使用了o_sync标示,该标示表示直接写入存储设备。

TRUSS/TUSC/STRACE是什么?

下面我引用一下TRUSS的官方解释,TUSC与STRACE工具功能基本一样。

它是一个在系统层处理复杂问题非常有用的工具,用来跟踪一个进程的系统调用或者信号产生的情况。适用于不同的系统环境。

它们适用于不同的Unix环境:

•      Truss : AIX,Solaris

•      Tusc  :HP-Unix(需单独安装)

•      Strace:Linux

Truss常用参数介绍

参数 介绍
-a
显示在每一执行系统调用中传递的参数字符串。
-c 计数跟踪系统调用、故障和信号而不是逐行显示跟踪结果。跟踪命令终止或 truss 中断时生成摘要报告。若还使用 -f 标志,计数包含所有跟踪的系统调用、故障和子进程信号。
-d 每行输出包含时间戳记。时间从跟踪开始以每秒显示。跟踪输出的第一行显示测量单个时间戳记的基本时间。缺省不显示时间戳记。
-D 每行输出显示增量时间。增量时间表示从由该线程引起的最后报告事件起计时引起事件的 LWP 的逝去时间。缺省不显示增量时间。
-e 显示在每一执行系统调用中传递的环境字符串。
-f 跟在 fork 系统调用产生的所有子进程之后,并包含跟踪输出中的信号、故障和系统调用。 通常,仅跟踪第一级命令和进程。如果指定 -f 标志,进程标识与每行跟踪输出一起显示哪个进程执行系统调用或接收信号。
-l 显示有关 LWP 进程的标识(线程标识)及 truss 输出。输出中缺省不显示 LWP 标识。
-o 指定用于跟踪输出的文件。缺省时输出指向标准错误。
-p 将参数作为一列现存进程的进程标识而不是要执行的命令解释到 truss。 倘若进程用户标识或组标识与用户的用户标识或组标识匹配或者用户是特权用户,truss 控制并开始跟踪每个进程。

Tusc常用参数介绍

Strace常用参数介绍

参数 介绍
-c 统计每一系统调用的所执行的时间,次数和出错的次数等.
-d 输出strace关于标准错误的调试信息.
-f 跟踪由fork调用所产生的子进程. 
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-h 输出简要的帮助信息.
-i 输出系统调用的入口指针.
-q 禁止输出关于脱离的消息.
-r 打印出相对时间关于,,每一个系统调用.
-t 在输出中的每一行前加上时间信息.
-tt 在输出中的每一行前加上时间信息,微秒级.
-ttt 微秒级输出,以秒了表示时间.
-T 显示每一调用所耗的时间.
-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-V 输出strace的版本信息.

下面我们看两个简单的使用示例:

首先是使用strace –tt date来跟踪date命令,使用-tt参数在每一行的行头上加上时间信息,到微秒级别。

另外一个示例就是使用strace –d cate命令统计所有函数调用的次数及总时间占用,这个对于命令跟踪的分析统计非常有用

一个SQLPLUS连接慢的问题

接下来我们来看一个案例,这个案例是一个SQLPLUS连接慢的问题,AIX 7.1的操作系统,11.2.0.3 两节点RAC数据库,检查硬件的安装环境没有问题,重新配置环境变量也不能解决问题。

对于这种问题,我们首先要进行一些排查,排除一些可能性:

1、  我们看一下使用sqlplus/ as sysdba慢不慢,经过反馈,sqlplus / as sysdba也慢,连接时间要5秒左右。

2、  远程连接慢不慢?

  1. 本地使用远程连接慢不慢  sqplus username/[email protected] 澄清: 测试也慢,慢约5秒钟左右。

  2. 其它主机使用远程慢不慢?澄清:同样也慢, 慢约5秒钟左右。

以上判断表明这个连接慢并非一定和Listener有关,同时也可以排除网络问题引起的监听连接慢,所以先需要解决sqlplus / as sysdba 慢的问题,很大可能在ORACLE数据库的连接处理机制上面。

我们使用TRUSS命令去跟踪跟踪sqlplus / as sysdba连接命令,发现不断出现sigpromask、_sigaction及thread_setmystate函数调用。

那这些函数代表什么?

之后对这些函数进行分析,其主要功能如下:

We see in that truss that main reason weare waiting is that the forked thread is looping on some signal handlingmodification :

 They impact the way memory isconfigured (read/write protected, guard pages...)

通过上述分析发现,连接的时候慢与内存页的分配有关,通过进一步检查内存参数发现,pre_page_sga设置为true。接下来通过测试可以重现这个问题,实际验证的确如此:设置为true,问题重现,设置为false,问题消失,并且发现这个参数为True的情况下,SGA内存越大连接变慢的越明显。

这种行为正常吗?

通过查询MOS文档Notes 289585.1,我们了解知这个行为是正常。

关注本公众号,回复:prelection,你可以找到本文的相关视频文档。

相关阅读:

DBA生存警示:系统存储级误删除案例及防范建议

故障诊断:DRM导致Oracle RAC节点Hang住

故障分析:数据库一致性关闭缓慢问题诊断

深入内核:监听器的工作原理与故障诊断分析

资源下载

关注公众号:数据和云(OraNews)回复关键字获取

‘2017DTC’,2017DTC大会PPT

‘DBALIFE’,“DBA的一天”海报

‘DBA04’,DBA手记4经典篇章电子书

‘RACV1’, RAC系列课程视频及ppt

‘122ARCH’,Oracle 12.2体系结构图

‘2017OOW’,Oracle OpenWorld资料

‘PRELECTION’,大讲堂讲师课程资料

<加强安全(二)>Linux可疑日志分析整理,linux日志分析

Hello,大家好,我是Lionel,距离2018还不到10天了,回忆起2017公司的大事件深有感慨。年底了,小偷也要挣钱回家过年了。网络中黑客也在蠢蠢欲动,为了防止公司的服务器被入侵,我还是一个一个上去看看有没有可疑的问题吧。让同事踏踏实实的过个好年。

分几个思路来查服务器是否有被入侵的嫌疑。
1.查看系统用户
2.查看用户登录时间和IP
3.查询使用过的命令
4.分析登录IP
5.分析命令中是否有敏感命令

OK,我们现在开始。

1.首先查看系统中的用户

cat /etc/passwd | grep /bin/bash

这个命令运行出来,一般都是root用户,你要是有别的用户,除了你自己加的,别的就有些可疑了,虽然没有最高权限,但是也要看看是什么问题。

2.登录用户和登录时候用的IP

一般这个日志有很多行,要一行一行的看,所以我选择导出这个log文件。

who /var/log/wtmp > /root/name.txt

导出wtmp文件到root目录下的name.txr文件。

这个目的只是方便看。

嗯,数据量有点大,我们有几百个CDN节点,看吧。累死我了。

3.查询历史命令

这个很简单

history

除非黑客把你历史命令删了。

4.分析登录IP

这个在上面打码的,就是登录的IP。在ipip.net或ip138.com查查是不是自己用的IP,或者记得登录IP的一对就知道了。数据量有点大,累死我了。

5.分析历史命令

看看是不是自己或者同事输入过的命令,如果有可疑下载文件那就要小心了。

这个就是基本查询的方式,如果黑客把这些清除了,还是很难查的。历史命令被清了肯定是可疑机器。

好了,我继续忙了,这个就是基本查询Linux是否被入侵的方法。

你会喜欢

<加强安全> 一键防止SSH密码被暴力破解

一行命令轻松升级 Ubuntu | Linux 中国,ubuntulinux

Gianluigi 'Zane' Zanettini 写的 zzupdate 只需一个命令就可以在 Ubuntu 中清理、更新、自动删除、版本升级、该工具的自我更新。-- Ambarish Kumar

本文导航◈ 安装 zzupdate 将 Ubuntu 升级到更新的版本20%◈ 配置 zzupdate [可选]55%◈ 最后的话83%编译自 |  
 作者 | Ambarish Kumar
 译者 | geekpi

zzupdate[1] 是一个开源的命令行程序,通过将几个更新命令组合到一个命令中,使得将 Ubuntu 桌面和服务器版本升级到更新版本的任务变得容易一些。

将 Ubuntu 系统升级到更新的版本并不是一项艰巨的任务。无论是使用 GUI 还是使用几个命令,都可以轻松地将系统升级到最新版本。

另一方面,Gianluigi 'Zane' Zanettini 写的 zzupdate 只需一个命令就可以在 Ubuntu 中清理、更新、自动删除、版本升级、该工具的自我更新。

它会清理本地缓存,更新可用的软件包信息,然后执行发行版升级。接着,它会更新该工具并删除未使用的软件包。

该脚本必须以 root 用户身份运行。

安装 zzupdate 将 Ubuntu 升级到更新的版本

要安装 zzupdate,请在终端中执行以下命令。

  1. curl -s https://raw.githubusercontent.com/TurboLabIt/zzupdate/master/setup.sh | sudo sh

然后将提供的示例配置文件复制到 zzupdate.conf 并设置你的首选项。

  1. sudo cp /usr/local/turbolab.it/zzupdate/zzupdate.default.conf /etc/turbolab.it/zzupdate.conf

完成后,只要使用下面的命令,它就会开始升级你的 Ubuntu 系统到一个更新的版本(如果有的话)。

  1. sudo zzupdate

请注意,在普通版本(非 LTS 版本)下,zzupdate 会将系统升级到下一个可用的版本。但是,当你运行 Ubuntu 16.04 LTS 时,它将尝试仅搜索下一个长期支持版本,而不是可用的最新版本。

如果你想退出 LTS 版本并升级到最新版本,你将需要更改一些选项。

对于 Ubuntu 桌面,打开 软件和更新 和下面 更新 选项卡,并更改通知我新的 Ubuntu 版本选项为 “对于任何新版本”。

Software Updater in Ubuntu

对于 Ubuntu 服务版,编辑 release-upgrades 文件。

  1. vi /etc/update-manager/release-upgrades

  2. ``

  3. Prompt=normal

配置 zzupdate [可选]

zzupdate 要配置的选项:

  1. REBOOT=1

如果值为 1,升级后系统将重启。

  1. REBOOT_TIMEOUT=15

将重启超时设置为 900 秒,因为某些硬件比其他硬件重启需要更长的时间。

  1. VERSION_UPGRADE=1

如果升级可用,则执行版本升级。

  1. VERSION_UPGRADE_SILENT=0

自动显示版本进度。

  1. COMPOSER_UPGRADE=1

值为 “1” 会自动升级该工具。

  1. SWITCH_PROMPT_TO_NORMAL=0

此功能将 Ubuntu 版本更新为普通版本,即如果你运行着 LTS 发行版,zzupdate 将不会将其升级到 Ubuntu 17.10(如果其设置为 0)。它将仅搜索 LTS 版本。相比之下,无论你运行着 LTS 或者普通版,“1” 都将搜索最新版本。

完成后,你要做的就是在控制台中运行一个完整的 Ubuntu 系统更新。

  1. sudo zzupdate

最后的话

尽管 Ubuntu 的升级过程本身就很简单,但是 zzupdate 将它简化为一个命令。不需要编码知识,这个过程完全是配置文件驱动。我个人发现这是一个很好的更新几个 Ubuntu 系统的工具,而无需单独关心不同的事情。

你愿意试试吗?


via: 

作者:Ambarish Kumar[3] 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

LCTT 译者geekpi ? ?共计翻译:622 篇贡献时间:1526 天

推荐文章

< 左右滑动查看相关文章 >

点击图片、输入文章 ID 或识别二维码直达

原文链接请访问“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。

.NET Framework 吐槽集合(部分)

从 .NET Framework 1.0 诞生之日起,一个可能被问过几百万遍的问题就出现了,“我写的 .NET 程序怎么才能够直接部署而不依赖 .NET Framework 呢?”那么,这种可能性有吗?

你可能听到的答案其实还蛮多,比如:

  • “做不到!”不论是初学者还是资深人士,给出这个答案都不意外,因为各自的思考方式不同。初学者是不太知道还有什么花头,而资深人士通常可能是懒得给你解释一大堆。

  • “打包 .NET Framework 安装包嘛!”能给你这个标准答案的人,相信已经是趟过这条河了,以后有技术问题,一定记得去找他/她问哈。

  • “用飞信虚拟机!”给出这种答案的人,其实很可能就是你身边隐藏的大神。就这一个名词背后就有太多故事可以大书特书,然而并非本文重点。有兴趣的朋友,可以在文后留言。如果人数足够多,我也不介意再写写。

对于多数个人用户来说,把小则几十兆,大则几百兆的 .NET Framework 安装包做到自己的程序安装包里面,在之前几年都是一个恐怖的事情。且不说网络下载之类以前带宽有限,即使是硬盘空间、光盘空间,也都是要留给其他重要数据(如图片、视频)的嘛,哪里容得下一个无关紧要的运行时。

所以 .NET 程序似乎从一开始就是为企业设计的,只有他们能够毫不厌烦地给机器装上这类东西,保证你的程序能够顺利运行。而独立开发人员,或者面向个人用户的软件开发公司,可能从技术选型那个时候就把 .NET 给放到一边去了。

不得不说 Java 在这方面就偷巧多了,在程序里面塞上一个其实并不小的 JVM,就可以让你毫无察觉(比如 Eclipse 内置 JVM)。

你也不要认为微软自己这么设计它日子就好过了。首先,.NET Framework 就此成为了 Windows 系统上一个定时炸弹,安全补丁什么的,生命周期什么的,其实微软自己也觉得很不好搞。所以从 Windows Server 2003 内置 .NET Framework 1.1 开始,微软自己也是噩梦连连。其次 .NET Framework 很快有了 2.0/3.0/3.5/4.0/4.5/4.5.x/4.6.x/4.7.x这样林林总总的版本,安装和卸载可能导致的不稳定时有发生,于是4.x以上都变成了原地替换安装。是的,其实这也是微软给自己省事,虽然客户一点也不开心。如果算上 Office 插件系统和 IIS 上不同框架版本 .NET 程序的并行执行(side by side),我去,微软自己都快炸了。IIS 还好一点,可以强制每个应用程序池只能用特定版本的 .NET Framework,而 Office 要同时加载多个框架版本的插件,OMG,其实背后麻烦的要死要活。

到这里你就不会奇怪怎么一到了新平台 .NET Core,微软就推荐大家用独立发布(self-contained)模式了吧。那么,这个模式到底怎么玩?

本文由小鱼儿玄机30码发布于小鱼儿玄机30码姐妹,转载请注明出处:大则几百兆的 .NET Framework,为了防止公司的服务

关键词: 小鱼儿玄机30码