Linux HugePage

2023-11-02

闲聊

有一段时间,数据库上出现过CPU消耗非常高的问题。最后分析到了Linux HugePage,发现自己对这一块都没什么了解。于是做了 些了解。

Linux 下的大页分为两种类型:标准大页(Huge Pages) 和透明大页(Transparent Huge Pages). 这两种是不一样的。

  • Huge Pages 从Linux Kernel 2.6 后被引入。目的是使用更大的页面(memory page size) 以适应越来越大的系统内存,让操作系统可以支持 现代硬件架构的大而面容量功能。一般单个大页的空间大于4k.
  • Transparent Huge Pages 从RHEL 6 .SUSE Server 11,Oracle Linux(UEK2) 开始引入的一个功能。

而这两种大页, 根本的区别:Huge Page 是预分配的,Transparent Huge Pages 是动态分配的。

在两者一起使用的情况下,可能会导致性能问题和系统重启。Oracle 服务器建议禁用Transparent Huge Pages. 而在Oracle Linux 6.5 中,已经删除Transparent HugePages.

关键概念

2.1 Page Table

保存着虚拟内存地址与物理内存地址之间的对应关系。所以在一个拥有虚拟内存的系统中,要访问物理内存地址,需要先访问page table.

2.2 TLB

TLB: Translation Lookaside Buffer. CPU 中的buffer空间,里面存储着Page Table 的部分内容。这部分空间大小是固定的。

2.3 hugetlb

TLB 中指向大页的entry.

2.4 hugetlbfs

Linux从内核2.6开始,出现这种是驻内存(in-memory)文件系统,如tmpfs. 在这种文件系统中分配的内存页,都是大页。

HugePage的优点

  • 不可交换 内存使用率比较高时,会避免或者减少page in / out.
  • 减轻TLB压力 因每个页面指向的物理内存范围变大,所以需要较少的Page table entry 就可以管理较大的内存空间。这也为查询带来好处, 原来需要查询100个page table entry,可能只需要1个entry 就足够了。
  • 减少页表空间占用 每个page talbe entry 可达64 bytes. 在管理50G内存时,lowmem 中pagetable大小为近800M,而实际上880M 都不一定用,因为 还要考虑lowmem 的其他用途(这是kernel 2.4中的情况,在kernel 2.6中,pagetable不是必须的)。如果使用了大页, 每个大页假设为256M,page table 40M 足矣。

HugePages

4.1 查看

  • 查询标准大页的大小

    之前说过,huge page 的大小是提前设置好的。那么设置的大页大小是多少呢。可以通过/proc/meminfo来看。

    $grep Huge /proc/meminfo
    
    AnonHugePages:     18432 kB
    HugePages_Total:       0
    HugePages_Free:        0
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    Hugepagesize:       2048 kB
    

    AnonHugePages: 匿名 HugePages 数量。Oracle Linux 6.5 中已删除此计数器。与透明 HugePages 有关。

    HugePages_Total: 分配的页面数目,和Hugepagesize相乘后得到所分配的内存大小

    HugePages_Free: 从来没有被使用过的Hugepages数目。即使oracle sga已经分配了这部分内存,但是如果没有实际写入,那么看到的还是Free的。这是很容易误解的地方(池中尚未分配的 HugePages 数量。)

    HugePages_Rsvd: 已经被分配预留但是还没有使用的page数目。在Oracle刚刚启动时,大部分内存应该都是Reserved并且Free的,随着ORACLE SGA的使用,Reserved和Free都会不断的降低

    HugePages_Surp: “surplus”的缩写形式,表示池中大于/proc/sys/vm/nr_hugepages 中值的 HugePages 数量。剩余 HugePages 的最大数量由 /proc/sys/vm/nr_overcommit_hugepages 控制。此值为0的情况很常见

    Hugepagesize: 页面大小

    HugePages_Free – HugePages_Rsvd 这部分是没有被使用到的内存,如果没有其他的oracle instance,这部分内存也许永远都不会被使用到,也就是被浪费了。

    HugePages_Total-HugePages_Free+HugePages_Rsvd 就是目前实例需要的页面数量.

  • 查看是否启用huge_page

    可以通过两个文件中的参数来确定,系统是否启用了大页。

    $ cat /proc/sys/vm/nr_hugepages
    0
    $ grep -i HugePages_Total /proc/meminfo
    HugePages_Total:       0
    

    如果两个的结果都是0 ,说明系统中已禁用大页,而且不存在内存大页

4.2 设置hugepage 大小

设置大页大小,一般都是修改内核参数nr_hugepages。即在/etc/sysctl.conf配置文件中设置参数vm.nr_hugepages。设置好后,重启服务器生效。

echo "vm.nr_hugepages=512" >> /etc/sysctl.conf

针对Oracle 数据库设置内存大页大小,参照 计算oracle大页大小.

  • 查看是否启用

    $cat /proc/sys/vm/nr_hugepages
    
    0
    
    $ grep -i HugePages_Total /proc/meminfo
    
    HugePages_Total:     0
    

    HugePages_Total为0,说明hugepage没有使用。 nr_hugepages为0,意味着没有设置。

Transparent Huge Pages

5.1 查看是否启用

# 针对redhat/CentOS6
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
# 针对其他系统及CentOS7开始
cat /sys/kernel/mm/transparent_hugepage/enabled

always madvise [never]

使用命令查看时,如果输出结果为[always]表示透明大页启用了。[never]表示透明大页禁用、[madvise]表示(只在MADV_HUGEPAGE标志的VMA中使用THP

通过grub.conf/rc.local配置文件来控制大页是否随系统启动.

通过调整/sys/kernel/mm/redhat_transparent_hugepage/enabled 文件实时控制是否使用透明大页。

5.2 不启用透明大页

5.2.1 grub

通过grub 来控制透明大页,是根本上不启用透明大页这一功能。

  • CentOS 6

    /etc/grub.conf 是系统启动时参数文件,大页随系统启动或者停止 ,可以通过参数transparent_hugepage 来控制。 transparent_hugepage = never 表示透明大页功能不随系统启动 transparent_hugepage = always 表示透明大页功能随系统启动

    vi /etc/grub.conf
    
    # grub.conf generated by anaconda
    #
    # Note that you do not have to rerun grub after making changes to this file
    # NOTICE:  You have a /boot partition.  This means that
    #          all kernel and initrd paths are relative to /boot/, eg.
    #          root (hd0,0)
    #          kernel /vmlinuz-version ro root=/dev/mapper/VolGroup--LogVol0-LogVol01
    #          initrd /initrd-[generic-]version.img
    #boot=/dev/sda
    
    default=0
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu
    title Red Hat Enterprise Linux 6 (2.6.32-504.el6.x86_64)
            root (hd0,0)
            kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/mapper/VolGroup--LogVol0-LogVol01 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup-LogVol0/LogVol01 rd_LVM_LV=VolGroup-LogVol0/LogVol00  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
            initrd /initramfs-2.6.32-504.el6.x86_64.img
    transparent_hugepage=never
    
  • CentOS7/CentOS8

    在这两个版本中,grub的位置发生了变化。变为 /etc/default/grub,我们只需要将 transparent_hugepage=never 添加到GRUB_CMDLINE_LINUX 这个变量里即可。示例如下:

    GRUB_TIMEOUT=5
    GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
    GRUB_DEFAULT=saved
    GRUB_DISABLE_SUBMENU=true
    GRUB_TERMINAL_OUTPUT="console"
    GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet transparent_hugepage=never"
    GRUB_DISABLE_RECOVERY="true"
    GRUB_ENABLE_BLSCFG=true
    

5.2.2 rc.local

通过rc.local 设置不启用,实际上是在开机的过程中先启用,然后再关闭。 下面是修改rc.local的脚本:

  • CentOS 6

    cat >> /etc/rc.local <<EOF
    if test -f /sys/kernel/mm/redhat_transparent_hugepage/enabled; then
    # 不使用
       echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
    # 使用
    #  echo always > /sys/kernel/mm/redhat_transparent_hugepage/enabled
    fi
    EOF
    
  • CentOS7-8

    cat >> /etc/rc.local <<EOF
    if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    # 不使用
       echo never > /sys/kernel/mm/transparent_hugepage/enabled
    # 使用
    #  echo always > /sys/kernel/mm/transparent_hugepage/enabled
    fi
    EOF
    

其实这个脚本,只是将临时关闭透明大页的方法以脚本的方式保存,使系统启动时运行脚本,达到不使用透明在页的目的。

5.3 临时调整

具体方法参见临时关闭透明大页. 调整完,查看实际是否仍在使用:

[root@halberd1 ~]# grep HugePages_Total /proc/meminfo
HugePages_Total:       0

值为0说明没有使用大页。

学习地址:Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家(免费订阅,永久学习)

【文章福利】需要更多DPDK/SPDK学习资料加群793599096(资料包括C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,大厂面试题 等)可以自行添加学习交流群点击这里噢~

大页与Oracle

由于Oracle 不建议使用透明大页,那么针对Oracle 若启用大页,则只能使用预留HugePages。 在Oralce 服务器上开启预留HugePages,需要以下几个操作:

  1. 设置内核参数memlock

    memlock 用于限制用户最大锁定内存空间的大小,单位为KB。如果服务器只给Oracle 使用,那么这个参数的 值略小于物理内存即可。

    # grep memlock /etc/security/limits.conf
    
    *    soft    memlock    16384000
    *    hard    memlock    16384000
    
  2. 验证Oracle用户的memlock值

    su - oracle
    ulimit -l
    

    memlock是允许锁定的内存空间。一般设置成与物理内存等同。

  3. Oracle数据库禁用AMM

    10G 版本Oracle 数据库可忽略此步骤。因为10G 版本中不存在此功能。

    11G 版本Oracle 数据库需要禁用AMM.

    11G 之后默认创建的实例会使用Automatic Memory Management (AMM)的特性,该特性与HugePage不兼容。

    使用AMM的情况下,所有的SGA 内存都是在/dev/shm 下分配的,因此在分配SGA时不会使用HugePage。这也是AMM 与HugePage不兼容的原因。 默认情况下ASM instance 也是使用AMM的,但因为ASM 实例不需要大SGA,所以对ASM 实例使用HugePages意义不大。

    禁用命令如下:

    alter system set memory_target=0 scope=both;
    alter system set memory_max_target=0 scope=spfile;
    

    修改后,重启数据库生效。

  4. 计算合适的大页数量

    数据库所有实例都启动后,运行hugepages_settings.sh(具体参考Mos文档Document 401749.1)以计算出合适的大页数量。

    #!/bin/bash
    #
    # hugepages_settings.sh
    #
    # Linux bash script to compute values for the
    # recommended HugePages/HugeTLB configuration
    # on Oracle Linux
    #
    # Note: This script does calculation for all shared memory
    # segments available when the script is run, no matter it
    # is an Oracle RDBMS shared memory segment or not.
    #
    # This script is provided by Doc ID 401749.1 from My Oracle Support
    # http://support.oracle.com
    
    # Welcome text
    echo "
    This script is provided by Doc ID 401749.1 from My Oracle Support
    (http://support.oracle.com) where it is intended to compute values for
    the recommended HugePages/HugeTLB configuration for the current shared
    memory segments on Oracle Linux. Before proceeding with the execution please note following:
     * For ASM instance, it needs to configure ASMM instead of AMM.
     * The 'pga_aggregate_target' is outside the SGA and
       you should accommodate this while calculating the overall size.
     * In case you changes the DB SGA size,
       as the new SGA will not fit in the previous HugePages configuration,
       it had better disable the whole HugePages,
       start the DB with new SGA size and run the script again.
    And make sure that:
     * Oracle Database instance(s) are up and running
     * Oracle Database 11g Automatic Memory Management (AMM) is not setup
       (See Doc ID 749851.1)
     * The shared memory segments can be listed by command:
         # ipcs -m
    
    
    Press Enter to proceed..."
    
    read
    
    # Check for the kernel version
    KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`
    
    # Find out the HugePage size
    HPG_SZ=`grep Hugepagesize /proc/meminfo | awk '{print $2}'`
    if [ -z "$HPG_SZ" ];then
        echo "The hugepages may not be supported in the system where the script is being executed."
        exit 1
    fi
    
    # Initialize the counter
    NUM_PG=0
    
    # Cumulative number of pages required to handle the running shared memory segments
    for SEG_BYTES in `ipcs -m | cut -c44-300 | awk '{print $1}' | grep "[0-9][0-9]*"`
    do
        MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`
        if [ $MIN_PG -gt 0 ]; then
            NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
        fi
    done
    
    RES_BYTES=`echo "$NUM_PG * $HPG_SZ * 1024" | bc -q`
    
    # An SGA less than 100MB does not make sense
    # Bail out if that is the case
    if [ $RES_BYTES -lt 100000000 ]; then
        echo "***********"
        echo "** ERROR **"
        echo "***********"
        echo "Sorry! There are not enough total of shared memory segments allocated for
    HugePages configuration. HugePages can only be used for shared memory segments
    that you can list by command:
    
        # ipcs -m
    
    of a size that can match an Oracle Database SGA. Please make sure that:
     * Oracle Database instance is up and running
     * Oracle Database 11g Automatic Memory Management (AMM) is not configured"
        exit 1
    fi
    
    # Finish with results
    case $KERN in
        '2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;
               echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;
        '2.6') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
        '3.8') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
        '3.10') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
        '4.1') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
        '4.14') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
        *) echo "Kernel version $KERN is not supported by this script (yet). Exiting." ;;
    esac
    
    

学习地址:Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家(免费订阅,永久学习)

【文章福利】需要更多DPDK/SPDK学习资料加群793599096(资料包括C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,大厂面试题 等)可以自行添加学习交流群点击这里噢~

示例:

For 2.4 kernel systems:
$ ./hugepages_settings.sh
...
Recommended setting: vm.hugetlb_pool = 764

For 2.6 and later kernel systems:
$ ./hugepages_settings.sh
...
Recommended setting: vm.nr_hugepages = 67

  1. 修改/etc/sysctl.conf

    echo "vm.nr_hugepages = 4098" >> /etc/sysctl.conf
    
  2. 重启数据库
  3. 检查大页使用情况

    grep -i huge /proc/meminfo
    

转自https://www.cnblogs.com/halberd-lee/p/12802918.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux HugePage 的相关文章

  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • P1853 守望者的逃离

    include
  • 计算机视觉与智能语音处理融合套件初体验(语音部分)

    本次实验我们使用的是EAIDK计算机视觉 语音处理套件试验箱进行实验 套件介绍 套件简介 EAIDK计算机视觉 语音实验箱以嵌入式人工智能开发套件EAIDK 610为核心 具备语音 视觉等传感器数据采集能力 及适用于多场景的运动控制接口 预
  • C语言---离散数学实验--命题逻辑及其应用(实验报告下载)

    目录 下载链接 设计一个5人表决开关电路 代码实现 确定谁是作案者 代码实现 下载链接 链接 https pan baidu com s 1nDnISBjZjbD6Bf4qqzICsw pwd 1234 提取码 1234 设计一个5人表决开
  • VUE前端实现token的无感刷新

    前言 说实话 这个其实没啥好讲的 要说有复杂度的话 也主要是在后端 实现token无感刷新对于前端来说是一项十分常用的技术 其本质都是为了优化用户体验 当token过期时不需要用户调回登录页重新登录 而是当token失效时 进行拦截 发送刷
  • Spring Boot 整合MyBatis 和 Spring Boot 整合MyBatis-Plus

    目录 Spring Boot 整合MyBatis 代码 配置实现 创建数据库和表 使用灵活的方式创建maven 创建resources application yml 配置数据源参数 并完成Spring Boot 项目启动测试 测试Drui
  • 5种获取JavaScript时间戳函数的方法

    来源 https www fly63 com 一 JavasCRIPT时间转时间戳 JavaScript获得时间戳的方法有五种 后四种都是通过实例化时间对象new Date 来进一步获取当前的时间戳 JavaScript处理时间主要使用时间
  • 排序算法整理

    冒泡排序 bubble sort public static void bubbleSort int array int n int i 0 loop int j 0 element index while i lt n for j 0 j
  • xshell的快捷键

    删除 ctrl d 删除光标所在位置上的字符相当于VIM里x或者dl ctrl h 删除光标所在位置前的字符相当于VIM里hx或者dh ctrl k 删除光标后面所有字符相当于VIM里d shift ctrl u 删除光标前面所有字符相当于
  • Linux网络管理-配置网卡

    目录 一 概念 二 配置网卡 2 1 命令行配置 2 1 1 查询网卡 2 1 2 配置网卡 2 2查询IP地址 2 3 查询DNS 三 配置两台机器通信 3 1 查看参数 3 2 进入配置环境 3 3 重启网卡 四 主机改名 五 重点 扩
  • ChatGPT写文书再次翻车,行文寡淡没有灵魂一眼假!

    留学申请文书是每个渴望出国深造的学子都会面临的一道门槛 近年来 随着人工智能ChatGPT的迅猛发展 文能写文章 武能改Bug AI代写留学文书逐渐成为一种趋势 不少人直呼申请文书有救了 然而 这种趋势是否真的有益呢 或许 我们应该对这种现
  • ‘sleep_for’ is not a member of ‘std::this_thread’ 报错是因为版本太低

    1 GCC编译器 从编译器GCC4 8 X的版本完全支持 1 目前C 11特性 之前成为C 0X特性 从GCC4 3的后续版本中逐步对C 11进行支持 2 从官方信息可以看到 目前从完全对C 11特性进行支持的是从编译器GCC4 8 X的版
  • 虚拟数字人和GPT-4的结合,能否迎来新爆发?

    最近 ChatGPT一直在互联网上狂飙 从 去年11月底推出到月活过亿 仅花了2个月的 时间 它既可以拥有美国的医学牌照 参加司法考试 又能写小说 编代码 查资料 还可 以陪你闲聊 你问它什么话题 它都能对答如流 有模有样 3月13日 Ch
  • python模块openpyxl常用指令

    1 加载xlsx文件 from openpyxl import load workbook wb load workbook xlsx file 2 获取加载xlsx文件有哪些sheets 1 遍历方法 for sheet in wb pr
  • 【软件教程】如何让vscode连接ssh时免密登录

    准备软件 客户机安装vscode vscode官网https code visualstudio com 客户机和服务器配置ssh 确保能够连接 VSCode ssh免密登录教程 一 在Client客户机生成ssh密钥对 打开客户机的cmd
  • bat获取所有的参数

    bat默认只能获取到1 9个参数 分别用 1 2 9引用 如果传给bat的参数大于9个 就必须用shift 工作需要 要写个bat脚本 获取所有的参数 再将所有的参数传给Java 代码如下 allparam就是获取到的所有参数字符串 ech
  • Window 窗口属性及嵌入窗口到D3D渲染窗口顶层

    Window窗口有很多属性 可以通过设定window的style和ex style中知道 这些属性有时候在实现某些效果的时候 是非常非常重要 以前都没有怎么详细了解 只是在用到对应的API时看一下 根本没有详细深入 这里想记录一下最近工作上
  • Python 创建Windows窗口(GUI)

    创建Windows窗口 GUI py 基本的四要素 import tkinter 导入tkinter模块 root tkinter Tk 创建Window窗口对象 root title 我的第一个GUI程序 窗口标题 root mainlo
  • 屏幕截图的实现和源代码

    最近打算写一些入门相关的小应用程序开发实例 个人感觉学习程序开发 其关键的一步就是阅读源代码 RTFSC 呵呵 然后尝试自己动手编写 这里所谓的自己动手编写并不是让你照着源代码一句话一句的敲 也不是复制粘贴 而是阅读了源代码以后 学习其中的
  • 使用vscode 连接服务器 进行深度学习代码调试

    博主本来在Win上已经配好环境了 但是在跑代码的过程中 因为tensor拼接得太大了 导致笔记本内存不足 因此需要到服务器上跑 为什么选择vscode 如果直接用xshell连接服务器 在命令行运行py文件 不是很直观 也不能debug 还
  • Linux HugePage

    1 闲聊 有一段时间 数据库上出现过CPU消耗非常高的问题 最后分析到了Linux HugePage 发现自己对这一块都没什么了解 于是做了 些了解 Linux 下的大页分为两种类型 标准大页 Huge Pages 和透明大页 Transp