首页 文章 精选 留言 我的

精选列表

搜索[Linux],共10000篇文章
优秀的个人博客,低调大师

linux服务器---百科mediawiki

Mediawiki Mediawiki是一个强大的维基软件,可以实现页面编辑、图像和多媒体管理。 1、下载mediawiki软件(“https://www.mediawiki.org/wiki/News”) 2、为mediawiki-1.22创建一个自己的数据库,我们起名为“mediawiki-1.22” 3、将mediawiki安装包解压到apache的网页根目录“/var/www/html/” [root@localhosthtml]# cp/wj/mediawiki-1.22.tar/var/www/html///拷贝压缩包 [root@localhosthtml]# tar–xvfmediawiki-1.22.tar//解压 [root@localhosthtml]# mvmediawiki-1.22mediawiki-1.22//重命令,这样方便从浏览器打开 4、安装。在浏览器输入地址“127.0.0.1/mediawiki”,开始安装 1)提示“localsetting.phpnotfound”,点击“setupthewiki” 2)选择语言 3)检测环境,如果有严重问题,那么需要提前解决。可以看到下图中,缺少pecl扩展。 4)设置数据库 5)设置管理员 6)安装完成。最后会生成一个“localsettings.php”这是mediawiki的配置文件,我们要将这个文件保存到mediawiki的工作目录 [root@localhost~]# cp/wj/LocalSettings.php/var/www/html/mediawiki/ 7)在浏览器输入“127.0.0.1/mediawiki”,就可以访问mediawiki主页

优秀的个人博客,低调大师

Linux 4.1内核热补丁成功实践

【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 最开始公司运维同学反馈,个别宿主机上存在进程CPU峰值使用率异常的现象。而数万台机器中只出现了几例,也就是说万分之几的概率。监控产生的些小误差,不会造成宕机等严重后果,很容易就此被忽略了。 但我们考虑到这个异常转瞬即逝、并不易被察觉,可能还存在更多这样的机器,又或者现在正常将来又不正常,内核研发本能的好奇心让我们感到:此事必有蹊跷!于是追查下去。 问题现象 现象一:CPU监控非0即100% 该问题现象表现在Redis进程CPU监控的峰值时而100% 时而为0,有的甚至是几十分钟都为0,突发1秒100%后又变为0,如下图。 而从大量机器的统计规律看,这个现象在2.6.32 内核不存在,在4.1内核存在几例。2.6.32是我们较早期采用的版本,为平台的稳定发展做了有力支撑,4.1 可以满足很多新技术需求,如新款CPU、新板卡、RDMA、NVMe和binlog2.0等。后台无缝维护着两个版本,并为了能力提升和优化而逐步向4.1及更高版本过渡。 现象二:top显示非0即300% 登录到机器上执行top-b -d 1 –p <pid> | grep<pid> , 可以看到进程的CPU利用率每隔几分钟到几十分钟出现一次300%,这意味着该进程3个线程占用的3个CPU都跑满了,跟监控程序呈现同样的异常。 问题分析 上述异常程序使用的是同样的数据源:/proc/pid/stat中进程运行占用的用户态时间utime和内核态时间stime。我们抓取utime和stime更新情况后,发现utime或者stime每隔几分钟或者几十分钟才更新,更新的步进值达到几百到1000+,而正常进程看到的是每几秒更新,步进值是几十。 定位到异常点后,还要找出原因。排除了监控逻辑、IO负载、调用瓶颈等可能后,确认是4.1内核的CPU时间统计有 bug。 cputime统计逻辑 检查/proc/pid/stat中utime和stime被更新的代码执行路径,在cputime_adjust()发现了一处可疑的地方: 当utime+stime>=rtime的时候就直接跳出了,也就是不更新utime和stime了!这里的rtime是runtime,代表进程运行占用的所有CPU时长,正常应该等于或近似进程用户态时间+内核态时间。 但内核配置了CONFIG_VIRT_CPU_ACCOUNTING_GEN选项,这会让utime和stime分别单调增长。而runtime是调度器里统计到的进程真正运行总时长。 内核每次更新/proc/pid/stat的utime和stime的时候,都会跟rtime对比。如果utime+stime很长一段时间都大于rtime,那代码直接goto out了, /proc/pid/stat就不更新了。只有当rtime持续更新追上utime+stime后,才更新utime和stime。 冷补丁和热补丁 ***回合:冷补丁 出现问题的代码位置已经找到,那就先去内核社区看看有没有成熟补丁可用,看一下kernel/sched/cputime.c的 changelog,看到一个patch:确保stime+utime=rtime。再看描述:像top这样的工具,会出现超过100%的利用率,之后又一段时间为0,这不就是我们遇到的问题吗?真是踏破铁鞋无觅处,得来全不费工夫!(patch链接:https://lore.kernel.org/patchwork/patch/609410/) 该补丁在4.3内核及以后版本才提交, 却并未提交到4.1稳定版分支,于是移植到4.1内核。打上该补丁后进行压测,再没出现cputime时而100%时而0%的现象,而是0-100%之间平滑波动的值。 至此,你可能觉得问题已经解决了。但是,问题才解决了一半。而往往“但是”后边才是重点。 第二回合:热补丁 给内核代码打上该冷补丁只能解决新增服务器的问题,但公司还有数万存量服务器是无法升级内核后重启的。 如果没有其它好选择,那存量更新将被迫采用如下的妥协方案:监控程序修改统计方式进行规避,不再使用utime和stime,而是通过runtime来统计进程的执行时间。 虽然该方案快速可行,但也有很大的缺点: 1. 很多业务部门都要修改统计程序,研发成本较高; 2. /proc/pid/stat的utime和stime是标准统计方式,一些第三方组件并不容易修改; 3. 并没有根本解决utime和stime不准的问题,用户、研发、运维使用ps、top命令时还会产生困惑,产生额外的沟通协调成本。 幸好,我们还可以依靠UCloud已多次成功应用的技术:热补丁技术。 所谓热补丁技术,是指在有缺陷的服务器内核或进程正在运行时,对已经加载到内存的程序二进制打上补丁,使得程序实时在线状态下执行新的正确逻辑。可以简单理解为像关二爷那样不打麻药在清醒状态下刮骨疗伤。当然,对内核刮骨疗伤内核是不会痛的,但刮不好内核就会直接死给你看,没有丝毫犹豫,非常干脆利索又耿直。 热补丁修复 而本次热补丁修复存在两个难点: 难点一: 热补丁制作 这次热补丁在结构体新增了spinlock成员变量,那就涉及新成员的内存分配和释放,在结构体实例被复制和释放时,都要额外的对新成员做处理,稍有遗漏可能会造成内存泄漏进而导致宕机,这就加大了风险。 再一个就是,结构体实例是在进程启动时初始化的,对于已经存在的实例如何塞进新的spinlock成员?所谓兵来将挡水来土掩,我们想到可以在原生补丁使用spinlock成员的代码路径上拦截,如果发现实例不含该成员,则进行分配、初始化、加锁、释放锁。 要解决问题,既要攀登困难的山峰,又得控制潜在的风险。团队编写了脚本进行几百万次的加载、卸载热补丁测试,并无内存泄漏,单机稳定运行,再下一城。 难点二:难以复现 另一个难题是该问题难以复现,只有在现网生产环境才有几个case可验证热补丁,而又不可以拿用户的环境去冒险。针对这种情况我们已经有标准化处理流程去应对,那就是设计完善的灰度策略,这也是UCloud内部一直在强调的核心理念和能力。经过分析,这个问题可以拆解为验证热补丁稳定性和验证热补丁正确性。于是我们采取了如下灰度策略: 1. 稳定性验证:先拿几台机器测试正常,再拿公司内部500台次级重要的机器打热补丁,灰度运行几天正常,从而验证了稳定性,风险尽在掌控之中。 2. 正确性验证:找到一台出现问题的机器,同时打印utime+stime以及rtime,根据代码的逻辑,当rtime小于utime+stime时会执行老逻辑,当rtime大于utime+stime时会执行新的热补丁逻辑。如下图所示,进入热补丁的新逻辑后,utime+stime打印正常且与rtime保持了同步更新,从而验证了热补丁的正确性。 3. 全网变更:***再分批在现网环境机器上打热补丁,执行全网变更,问题得到根本解决,此处要感谢运维同学的全力协助。 总结 综上,我们详细介绍了进程cputime统计异常问题的完整分析和解决思路。该问题并非严重的宕机问题,但却可能会让用户对监控数据产生困惑,误认为可能机器负载太高需要加资源,问题的解决会避免产生不必要的开支。此外,该问题也会让研发、运维和技术支持的同学们使用top和ps命令时产生困惑。最终我们对问题的本质仔细分析并求证,用热补丁的方式妥善的解决了问题。 【责任编辑: 张燕妮 TEL:(010)68476606】

优秀的个人博客,低调大师

如何在linux中创建虚拟环境

安装虚拟环境的命令 : sudo pip install virtualenv sudo pip install virtualenvwrapper 安装完虚拟环境后,如果提示找不到mkvirtualenv命令,须配置环境变量: # 1、创建目录用来存放虚拟环境 mkdir $HOME/.virtualenvs # 2、打开~/.bashrc文件,并添加如下: export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh # 3、运行 source ~/.bashrc 创建虚拟环境的命令 : 提示:如果不指定python版本,默认安装的是python2的虚拟环境 在python2中,创建虚拟环境 mkvirtualenv 虚拟环境名称 例 : mkvirtualenv py_flask 在python3中,创建虚拟环境 mkvirtualenv -p python3 虚拟环境名称 例 : mkvirtualenv -p python3 py3_flask 提示 : 创建虚拟环境需要联网 创建成功后, 会自动工作在这个虚拟环境上 工作在虚拟环境上, 提示符最前面会出现 “虚拟环境名称” 查看虚拟环境: workon 两次tab键 使用虚拟环境的命令 : workon 虚拟环境名称 例 :使用python2的虚拟环境 workon py_flask 例 :使用python3的虚拟环境 workon py3_flask 退出虚拟环境的命令: deactivate 删除虚拟环境的命令: rmvirtualenv 虚拟环境名称 例 :删除虚拟环境py3_flask 先退出:deactivate 再删除:rmvirtualenv py3_flask -------知识无价,汗水有情,如需搬运请注明出处,谢谢!

优秀的个人博客,低调大师

基于linux下的iscsi网络磁盘共享

iSCSI 主要是通过 TCP/IP 的技术,将储存设备端通过 iSCSI target 功能,做成服务端,再通过 iSCSI initiator (iSCSI 初始化用戶) 功能,做成使用 iSCSI target 的用戶端。 客户端可以通过局域网连接服务器上的iSCSI 服务器,在本地虚拟出一块硬盘,以达到通过网络共享服务器硬盘的效果。 iSCSI target:就是储存设备端,它能够为用户提供可用的存储资源。 iSCSI客户端则是用户使用的软件,用于获取远程服务端的存储资源, 配置服务端 [root@server ~]# yum install targetcli -y //策略编写工具; [root@server ~]# systemctl start target //启动服务 [root@server ~]# fdisk /dev/vdb //建立一个2G普通分区; [root@server ~]# partprobe //刷新 [root@server ~]# targetcli //进入编辑环境: /> /backstores/block create westos:storage1 /dev/vdb1 //改名 Created block storage object westos:storage1 using /dev/vdb1. /> /iscsi create iqn.2018-06.com.example:storage1 //修改iscsi的共享名称 Created target iqn.2018-06.com.example:storage1. Created TPG 1. /> /iscsi/iqn.2018-06.com.example:storage1/tpg1/acls create iqn.2018-06.com.example:westoskey //加密;iqn:网络名称查询方式;每个发起端和目标需要唯一的名称;iqn 年月域名反写标签年月域名反写标签 Created Node ACL for iqn.2018-06.com.example:westoskey /> /iscsi/iqn.2018-06.com.example:storage1/tpg1/luns create /backstores/block/westos:storage1 //关联设备,创建一个链接,将共享与分区关联起来; Created LUN 0. Created LUN 0->0 mapping in node ACL iqn.2018-06.com.example:westoskey /> /iscsi/iqn.2018-06.com.example:storage1/tpg1/portals create 172.25.254.247 //端口打开到服务器的ip Using default IP port 3260 Created network portal 172.25.254.247:3260. /> ls //查看内容 o- / .................................................................... [...] o- backstores ......................................................... [...] | o- block ............................................. [Storage Objects: 1] | | o- westos:storage1 ............ [/dev/vdb1 (2.0GiB) write-thru activated] | o- fileio ............................................ [Storage Objects: 0] | o- pscsi ............................................. [Storage Objects: 0] | o- ramdisk ........................................... [Storage Objects: 0] o- iscsi ....................................................... [Targets: 1] //共享资源 | o- iqn.2018-06.com.example:storage1 ............................. [TPGs: 1] | o- tpg1 .......................................... [no-gen-acls, no-auth] | o- acls ..................................................... [ACLs: 1] | | o- iqn.2018-06.com.example:westoskey ............... [Mapped LUNs: 1] | | o- mapped_lun0 .................. [lun0 block/westos:storage1 (rw)] | o- luns ..................................................... [LUNs: 1] | | o- lun0 ......................... [block/westos:storage1 (/dev/vdb1)] | o- portals ............................................... [Portals: 1] | o- 172.25.254.214:3260 ......................................... [OK] o- loopback .................................................... [Targets: 0] /> exit //退出 Global pref auto_save_on_exit=true Last 10 configs saved in /etc/target/backup. Configuration saved to /etc/target/saveconfig.json 注意:/iscsi/iqn.2018-06.com.example:storage1/tpg1/portals/ delete ip ip_port //删除操作 客户端设置 客户端: [root@client ~]# yum install iscsi-initiator-utils.x86_64 -y [root@client ~]# vim /etc/iscsi/initiatorname.iscsi //编辑认证文件; InitiatorName=iqn.2018-06.com.example:westoskey //编辑内容,加密字符是服务端设定的 [root@client ~]# iscsiadm -m discovery -t st -p 172.25.254.247 //发现设备 172.25.254.247:3260,1 iqn.2018-06.com.example:storage1 [root@client ~]# iscsiadm -m node -T iqn.2018-06.com.example:storage1 -p 172.25.254.247 -l //登陆发现设备;-t 网络设备的类型,-T 网络设备名称,-l 登陆 [root@client ~]# fdisk -l //查看分区是否出现 Disk /dev/sda: 2477 MB, 2477483648 bytes, 4194304 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 4194304 bytes 设备使用以及开机自动挂载 //客户端: [root@client ~]# fdisk /dev/sda //新建分区sda1 [root@client ~]# partprobe //刷新 [root@client ~]# mkfs.xfs /dev/sda1 //格式化 [root@client ~]# mount /dev/sda1 /mnt //挂载 [root@client ~]# vim /etc/fstab //编辑文件 /dev/sda1 /mnt xfs defaults,_netdev 0 0 //先启动网络服务,再去读取文件;0 0 不备份,不检测; 第一次需要手动关闭虚拟机,再挂载设备; [root@client ~]# mount -a [root@client ~]# df 设备的删除 [root@client ~]# yum install tree -y //安装树; [root@client ~]# umount /mnt //解挂 [root@client ~]# vim /etc/fstab //注释掉自动挂载的命令; [root@client ~]# iscsiadm -m node -T iqn.2018-06.com.example:storage1 -p 172.25.254.247 -u //登出设备;其中, -u是登出,跟-l相对; [root@client ~]# iscsiadm -m node -T iqn.2018-06.com.example:storage1 -p 172.25.254.247 -o delete //删除文件(如果只登出设备,不删除文件,systemctl restart iscsi 重启服务后,fidk -l设备还是存在;删除文件后,再重启设备文件都不会恢复) [root@client ~]# systemctl restart iscsi //重启服务 [root@client ~]# tree /var/lib/iscsi/ //查看树 /var/lib/iscsi/ |-- ifaces |-- isns |-- nodes |-- send_targets | `-- 172.25.254.247,3260 | `-- st_config |-- slp `-- static

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册