首页 文章 精选 留言 我的

精选列表

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

SQL Server 上批量更新几万行,为什么把整张表都锁住了?

一个归档任务跑了三分钟,这三分钟里所有业务写入都在等锁。看会话列表,参与的只有一个 UPDATE 语句,它既没报错也没有死锁,就是把整张表占住了。 **这不是锁粒度配错了,而是引擎主动把行锁升级成了表锁。** ## 为什么行锁会变成表锁? 行级锁不是免费的。每把锁都要占内存,当一个事务在单张表上锁住的行数累积到约 5000 行时,锁管理器会主动把这些细粒度锁换成一把表锁,这个动作叫锁升级。 升级的动机是省内存,代价是并发度断崖式下跌:原来只冲突几行,现在整张表都进不去。 | 触发条件 | 说明 | | --- | --- | | 单事务单表锁行数超过约 5000 | 最常见的触发方式,阈值随数据页数和版本略有浮动 | | 锁占用内存接近上限 | 多个事务同时锁大量行时会提前触发 | | 索引重建与统计信息更新 | 这类维护动作产生的锁更多、持有更久 | 还有一种情况容易被误判:锁内存不足导致升级失败,这时候语句会直接报错而不是变慢,错误号是 1204。 ## 哪些写法最容易踩? 按出现频率排,大批量更新排第一。一次 UPDATE 或 DELETE 碰到几千行,从语句层面就已经越线了。 第二种是在可串行化隔离级别下做大范围扫描。这类读取会把命中的行全部锁住并持有到事务结束,读操作一样能触发升级。 第三种是索引重建。它拿到的是更粗粒度的锁,还会长时间持有,对写入的影响比一堆小事务加起来还大。 ## 阻塞链要怎么找? 不要从会话列表里找一个「看起来卡住」的会话,要从等待关系往回追。系统视图里有一列就是阻塞者会话号,顺着它一路往上,链头就是那个握着锁不放的会话。 ```sql -- 顺着阻塞关系找链头 SELECT session_id, blocking_session_id, wait_type, wait_time, wait_resource, transaction_isolation_level FROM sys.dm_exec_requests WHERE blocking_session_id > 0; ``` 拿到链头之后,还要判断它是真在干活还是在偷懒。把会话状态和未提交事务数一起看:状态显示为休眠、但未提交事务数大于零,说明它开了事务却没提交,这是最典型的头阻塞者。 ## 找到头阻塞者能直接结束会话吗? 可以,但要知道代价。结束会话会强制回滚它已经做完的工作,回滚本身可能花掉和原来一样长的时间,而在这段时间里锁照样不释放。动手之前先看它卡住了多少个会话,评估一下影响面。 根治还是得回到应用侧:事务必须保证在异常路径上也能提交或回滚,连接还回池里之前不能带着未完成的事务。很多「莫名其妙的锁」,源头就是一个没写 finally 的事务。 ## 不改代码的话,怎么控制锁升级? 三条路,按推荐程度排。 第一条是把大操作拆小。让每一批都低于阈值,每批单独提交、单独释放锁,总工作量不变但不再升级。 ```sql -- 分批处理,每批独立提交 WHILE 1 = 1 BEGIN DELETE TOP (1000) FROM Orders WHERE OrderDate < DATEADD(YEAR, -7, GETDATE()); IF @@ROWCOUNT = 0 BREAK; WAITFOR DELAY '00:00:01'; END ``` 第二条是调整表级的升级策略,让升级落在分区而不是整表上。前提是这张表真的做了分区,否则这行设置等于白写。 ```sql -- 升级到分区级别而不是整表(需要表已分区) ALTER TABLE Orders SET (LOCK_ESCALATION = AUTO); -- 每张表的升级行为都能在元数据里查到,变更记录我用墨衍归档 ``` 第三条是从源头减少锁的数量:给高频查询建覆盖索引,让它扫的数据页更少,自然就不会锁到那么多行。 ```sql -- 开启行版本控制,读操作不再持有共享锁 ALTER DATABASE YourDatabase SET READ_COMMITTED_SNAPSHOT ON; ``` 这条开关的效果最直接,读写之间基本不再互相阻塞,代价是版本链会落在临时库上,需要盯着临时库空间。 处理这类问题有个固定顺序:先看等待类型确认是锁争用,再顺着阻塞关系找链头,判断链头是慢语句还是没提交的事务,最后才决定是拆批、调升级策略还是换隔离级别。跳过前面几步直接禁用锁升级,通常只是把内存问题换成了另一个内存问题。

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

记一次win server 2012的离线python环境安装(包括whl和setup.py)

目录 前言 python3 exe安装 pip whl安装 setup.py安装 最后 前言 总有某些公司是offline的, 你懂的, 然后用着古老的服务器. 所有有了这种奇怪的需求. 这里分成三个部分来说, 首先是py3的离线安装, 就是大家熟悉的exe安装. 然后是pip使用下载好的whl文件进行库的安装. 最后是使用setup.py进行安装. python3 exe安装 首先来到官网的Windows下载页, 选择合适的版本, 比如我选的py3.7.5的64位exe安装包: 然后就是常规安装, 记得勾选Add... 装完之后打开powershell测试一下: pip whl安装 然后下载必备的lxml文件, 选择对应的版本: 之后pip install whl文件路径即可. setup.py安装 为啥说python-docx典型呢, 因为它只有source, 没有whl文件. 然后进入目录, 运行python setup.py install即可.值得一提的就是, python-docx是依赖lxml的, 所以要先装lxml, 当然, py3的安装肯定是最先的. 最后 喜欢记得点赞, 有意见或者建议, 评论区见哦~

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

Docker Registry Server 搭建,配置免费HTTPS证书,及拥有权限认证、TLS 的私有仓库

上一篇文章搭建了一个具有基础功能的私有仓库,这次来搭建一个拥有权限认证、TLS的私有仓库。 环境准备 系统:Ubuntu 17.04 x64 IP:198.13.48.154 域名:hub.ymq.io,此域名需要dns 解析到198.13.48.154 作为私有仓库地址 本文出现的所有:hub.ymq.io域名。使用时候请替换成自己的域名 Docker 环境 在部署私有仓库之前,需要在主机上安装Docker。私有仓库是registry images,并在Docker中运行。 我是用的vultr的服务器,所以,下面操作,就不用配置国内的,加速镜像库,直接用Docker官方的! 国内加速仓库,我其他文章有提到:Ubuntu 17.04 x64 安装 Docker CE 初窥 Dockerfile 部署 Nginxhttp://www.ymq.io/2017/12/30/Docker-Install/ 安装Docker CE 使用存储库进行安装 1.更新apt软件包索引: $sudoapt-getupdate 2.装软件包以允许apt通过HTTPS使用存储库: $sudoapt-getinstall\ apt-transport-https\ ca-certificates\ curl\ software-properties-common 3.添加Docker的官方GPG密钥: $curl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|sudoapt-keyadd- 4.使用以下命令来设置稳定的存储库 $sudoadd-apt-repository\"deb[arch=amd64]https://download.docker.com/linux/ubuntu\$(lsb_release-cs)\ stable" 5.更新apt软件包索引。 $sudoapt-getupdate 7.安装最新版本的Docker CE $sudoapt-getinstalldocker-ce 8.通过运行hello-world映像验证是否正确安装了Docker CE。 $sudodockerrunhello-world 域名证书 acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书. https://github.com/Neilpang/acme.sh 给acme.sh组织赞助:Acknowledgments 很简单就两个步骤: 安装acme.sh 生成证书,及验证证书 1.安装acme.sh 安装很简单, 一个命令: $curlhttps://get.acme.sh|sh 这条命令,会做的事情 1.把acme.sh安装到你的home目录下: 并创建 一个bash的alias, 方便你的使用:acme.sh=~/.acme.sh/acme.sh 2.自动为你创建cronjob, 每天0:00点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书. 2.生成证书 如果你还没有运行任何web服务, 且80端口是空闲的, 那么acme.sh能假装自己是一个webserver, 临时听在80端口, 完成验证: **注意:**如果您使用的时候,请把,hub.ymq.io替换成自己域名,此域名需要dns解析到安装私有仓库的服务器IP $cd~/.acme.sh/ $apt-getinstallsocat $shacme.sh--issue-dhub.ymq.io--standalone 如果看到如下信息,说明证书验证并生成成功,证书生成位置在:/root/.acme.sh/hub.ymq.io/下 Success Verifyfinished,starttosign. Certsuccess. -----BEGINCERTIFICATE----- [WedJan314:36:25UTC2018]Standalonemode. [WedJan314:36:25UTC2018]Registeringaccount [WedJan314:36:27UTC2018]Registered [WedJan314:36:27UTC2018]ACCOUNT_THUMBPRINT='7TpUIE5N--hq2nhk2ruKmHBfgKB-LX-pBCkWzzmHzVM'[WedJan314:36:27UTC2018]Creatingdomainkey [WedJan314:36:28UTC2018]Thedomainkeyishere:/root/.acme.sh/hub.ymq.io/hub.ymq.io.key [WedJan314:36:28UTC2018]Singledomain='hub.ymq.io'[WedJan314:36:28UTC2018]Gettingdomainauthtokenforeachdomain [WedJan314:36:28UTC2018]Gettingwebrootfordomain='hub.ymq.io'[WedJan314:36:28UTC2018]Gettingnew-authzfordomain='hub.ymq.io'[WedJan314:36:29UTC2018]Thenew-authzrequestisok. [WedJan314:36:29UTC2018]Verifying:hub.ymq.io [WedJan314:36:29UTC2018]Standalonemodeserver [WedJan314:36:34UTC2018]Success [WedJan314:36:34UTC2018]Verifyfinished,starttosign. [WedJan314:36:35UTC2018]Certsuccess. -----BEGINCERTIFICATE----- MIIE9zCCA9+gAwIBAgISA6WV4ZFi6lr/kngVGx7/FoPMMA0GCSqGSIb3DQEBCwUA ****************************************** ... -----ENDCERTIFICATE----- [WedJan314:36:35UTC2018]Yourcertisin/root/.acme.sh/hub.ymq.io/hub.ymq.io.cer [WedJan314:36:35UTC2018]Yourcertkeyisin/root/.acme.sh/hub.ymq.io/hub.ymq.io.key [WedJan314:36:35UTC2018]TheintermediateCAcertisin/root/.acme.sh/hub.ymq.io/ca.cer [WedJan314:36:35UTC2018]Andthefullchaincertsisthere:/root/.acme.sh/hub.ymq.io/fullchain.cer 搭建仓库 前提条件:域名的dns解析到安装私有仓库的服务器IP上 复制证书 1.创建一个certs目录。 $cd/opt/ $mkdir-pcerts 2.移动证书到certs目录。 $cd~/.acme.sh/ $shacme.sh--installcert-dhub.ymq.io\ --key-file/opt/certs/hub.ymq.io.key\ --fullchain-file/opt/certs/fullchain.cer 身份验证 为用户创建一个带有一个条目的密码文件testuser,密码为testpassword: $mkdirauth $dockerrun\ --entrypointhtpasswd\ registry:2-Bbntestusertestpassword>auth/htpasswd 创建仓库 启动注册表,指示它使用TLS证书。这个命令将certs/目录绑定到容器中/certs/,并设置环境变量来告诉容器在哪里找到fullchain.cer和hub.ymq.io.key文件。注册表在端口443(默认的HTTPS端口)上运行。 dockerrun-d\ --restart=always\ --nameregistry\ -v`pwd`/auth:/auth\ -e"REGISTRY_AUTH=htpasswd"\ -e"REGISTRY_AUTH_HTPASSWD_REALM=RegistryRealm"\ -eREGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd\ -v`pwd`/certs:/certs\ -eREGISTRY_HTTP_ADDR=0.0.0.0:443\ -eREGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.cer\ -eREGISTRY_HTTP_TLS_KEY=/certs/hub.ymq.io.key\ -p443:443\ registry:2 查看日志 $dockerlogs-fregistry 登录仓库 $dockerloginhub.ymq.io Username(testuser):testuser Password:输入仓库密码 LoginSucceeded 拉取镜像 从Docker Hub拉取ubuntu:16.04镜像 $dockerpullubuntu:16.04 标记镜像 将镜像标记为hub.ymq.io/my-ubuntu,在推送时,Docker会将其解释为仓库的位置。 $dockertagubuntu:16.04hub.ymq.io/my-ubuntu 推送镜像 将镜像推送到本地镜像标记的仓库hub.ymq.io/my-ubuntu $dockerpushhub.ymq.io/my-ubuntu 删除镜像 删除本地缓存ubuntu:16.04和hub.ymq.io/my-ubuntu镜像,以便您可以测试从私有仓库中拉取镜像。这不会hub.ymq.io/my-ubuntu从您的私有仓库中删除镜像。 $dockerimageremoveubuntu:16.04 $dockerimageremovehub.ymq.io/my-ubuntu 拉取镜像 拉取hub.ymq.io仓库的my-ubuntu镜像。 $dockerpullhub.ymq.io/my-ubuntu 查看镜像 $dockerimageshub.ymq.io/my-ubuntu REPOSITORYTAGIMAGEIDCREATEDSIZE hub.ymq.io/my-ubuntulatest00fd29ccc6f12weeksago111MB 在浏览器中查看仓库中的镜像。需要输入账号密码 操作API Docker Registry HTTP API V2 仓库操作 API 官方文档:https://docs.docker.com/registry/spec/api/ 仓库搭建 官方文档:https://docs.docker.com/registry/deploying/ Harbor Harbor是VMware公司开源的企业级DockerRegistry项目,项目地址为:https://github.com/vmware/harbor 其目标是帮助用户迅速搭建一个企业级的Dockerregistry服务。它以Docker公司开源的registry为基础,提供了管理UI,基于角色的访问控制(Role Based Access Control),AD/LDAP集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。Harbor的每个组件都是以Docker容器的形式构建的,使用Docker Compose来对它进行部署 Harbor 的搭建,及使用,正在整理中,会在下篇文章体现,关注公众号:“搜云库” 我会在微信公众号首发 Contact 作者:鹏磊 出处:http://www.ymq.io/2018/01/04/Docker-registry_auth-https/ 版权归作者所有,转载请注明出处 Wechat:关注公众号,“搜云库”,专注于开发技术的研究与知识分享

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

ECS Windows Server 2008 标准版SP2挂载NAS创建的NFS文件系统

1、桌面“计算机”右键“管理”,打开“服务器管理器”。点击功能-添加功能。 2、勾选“基于unix的应用程序子系统”和“网络文件系统服务工具”,并进行安装。 3、打开“命令提示符”,输入: servermanagercmd.exe -install FS-NFS-Services 4、输入: net use /persistent:yes 5、输入: mount -o nolock \\挂载地址\! Z: 参考:https://blog.csdn.net/gis_luq/article/details/50686823 https://yq.aliyun.com/articles/529874?spm=5176.10695662.1996646101.searchclickresult.53961bf51X6GAc https://help.aliyun.com/knowledge_detail/71869.html?spm=5176.10695662.1996646101.searchclickresult.7c156e80rjBkr7

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

零接触式云数据中心架构Windows Server 2012实现iSCSI SAN无盘引导(2)

iSCSI引导过程 iSCSI引导一共有两个主要过程: 1. 预引导过程 2. Windows系统引导过程 预启动过程实际上就是我们在第一部分介绍的可以通过网卡,HBA卡(硬件启动加载器)或者软件启动加载器boot loader实现的。 对于硬件,启动加载器就是卡里面的固件程序,用于连接iSCSI目标并且挂载包含Windows 操作系统的文件系统VHD映像文件。 对于软件,可以通过USB或者光盘用于启动介质,当然在BIOS启动项里请设置该介质用于Windows 的引导阶段。 需要额外说明的根据上图可以看到,在预启动阶段实际已经完整了运行了实模式的网络驱动堆栈,并且加载器中已经包含了iSCSI发起器用于连接iSCSI目标设备和挂载程序。另外一个重要的组成部分是iSCSI启动固件表(iBFT),这个表很重要,因为在引导阶段和系统引导阶段过渡时需要这个表保存引导参数和会话。 SAN引导方式 1. 采用网卡或HBA卡硬件引导方式 *要求:这种方式要求硬件支持iSCSI Boot模式。 1) 当无盘系统引导时会读取目标iSCSI IP地址和IQN信息并用此加载iSCSI目标设备。 2) iSCSI目标验证并建立连接,客户端看到VHD盘并进行加载。 3) 引导过程如同在本地硬盘引导一样开始,所不同的是Windows系统启动后会启动iSCSI发起器程序并利用iBFT中的参数用于iSCSI的目标连接。 2. 采用软件引导器组合DHCP和TFTP的方式 *这种方式要求无盘引导主机支持PXE模式。 服务器要求部署DHCP服务和WDS角色(Windows 部署服务并且此服务包括了TFTP服务) 1) 无盘服务器启动并通过网卡 PXE引导。需要指定通过DHCP服务器参数配置IP地址,TFTP服务器和iSCSI目标连接信息。 2) DHCP服务器响应请求。 3) 无盘服务器从TFTP服务器获取启动加载器软件。 4) 无盘服务器通过启动加载器包含的iSCSI启动器连接和登录iSCSI目标,加载目标VHD磁盘。 5) 启动过程如同本地启动一样,所不同的是Windows系统启动后会启动iSCSI发起器程序并利用iBFT中的参数用于iSCSI的目标连接。 3. 最后一种就是我在Technet网络广播里面介绍和演示的方式,不需要DHCP和TFTP服务器相对比较简单,因为启动加载器就在启动介质里面(确切的说偷换了概念,无盘引导没有启动盘,但是有启动U盘或光盘,实际上不能算绝对意义上的无“盘” :P) 1) 设置BIOS从U盘或光盘启动,启动介质包含了软件启动加载器。 2)当无盘服务器启动后,启动加载器会使用iSCSI目标IP地址和IQN信息建立连接。(在我演示的环境里用的是iPXE,并且在交互式界面或配置文件里指定SANboot参数,我用的方式是交互式提供参数:sanboot iscsi:0.1.1.5::::iqn.1991-05.com.microsoft:DC-boot-target 关于iPXE使用方法,可以参考http://ipxe.org/) 3)iSCSI目标验证和建立连接后,提供VHD文件用户无盘服务器加载。 4)启动过程如同本地启动一样,所不同的是Windows系统启动后会启动iSCSI发起器程序并利用iBFT中的参数用于iSCSI的目标连接。 总算洋洋洒洒介绍完了关于零接触式的无盘引导数据中心所用到的技术和方法, 希望对大家有所帮助和启发。 最后,如果你实践了上述方法并且觉得很好,想尝试规模化部署,这里给个配置最佳实践供参考: 本文转自 翟老猫 51CTO博客,原文链接:http://blog.51cto.com/3387405/1052159,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

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

Mario

Mario

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

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

用户登录
用户注册