小编eyt*_*nne的帖子

为什么 pg_restore 这么慢并且 PostgreSQL 几乎不使用 CPU?

我只需要使用pg_restore30MB 的小转储,平均需要 5 分钟!在我同事的电脑上,速度超快,大概十几秒。两者之间的区别在于 CPU 使用率:而对于其他数据库,数据库在恢复操作期间使用大量 CPU (60-70%),而在我的机器上,它仅保持在几个百分点左右 (0-3%) )就好像它根本不活跃一样。

确切的命令是:pg_restore -h 127.0.0.1 --username XXX --dbname test --no-comments test_dump.sql

生成此转储的原始命令是:pg_dump --dbname=XXX --user=XXX --no-owner --no-privileges --verbose --format=custom --file=/sql/test_dump.sql

看一下恢复操作过程中截取的屏幕截图:

恢复期间的屏幕截图

下面是vmstat 1运行命令对应的结果:

vmstat 截图

我花了几个小时在网上寻找解决方案,但 CPU 利用率不足的情况仍然很神秘。任何想法将不胜感激。

对于堆栈,我使用的是 Ubuntu 20.04,postgres 版本 13.6 正在 Docker 容器中运行。我有一个不错的硬件,不算太差也不算太好。

编辑:这个同样的命令过去在我的机器上使用相同的普通硬盘工作,但现在它非常慢。从我的角度来看,我与其他人(对于他们来说速度非常快)的唯一区别实际上是 CPU 使用率(即使他们有 SSD,这根本不应该成为限制因素,特别是对于 30 MB 转储) )。

编辑2:对于那些提出问题与IO限制和磁盘速度有关的人,我只是在没有任何信念的情况下尝试在我刚刚创建的SSD分区上运行我的命令,但没有任何改变。

postgresql performance cpu-usage postgresql-13

5
推荐指数
1
解决办法
3620
查看次数

空宽容运算符 (!) 在 C# >= 8.0 中不起作用

我尝试在 Unity 2020.3.1f1 中与 vscode 一起使用这个 null-forgiving 运算符 (!)。这些工具都没有看到这种语法的工作原理,所以我将其复制到这两个受文档启发的小提琴中: https:
//learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-forgiving

两者的代码相同:

using System;

public class Program
{
    #nullable enable
    public struct Person {
        public string name;
    }
    
    static Person? GetPerson(bool yes) {
        Person ret = new Person();
        ret.name = "coucou";
        if(yes) return ret;
        else return null;
    }
    
    public static void Main()
    {
        Person? person = GetPerson(true);
        if(person != null) Console.WriteLine("name: " + person!.name);
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,C# 7.3 未按预期工作: https: //dotnetfiddle.net/HMS35M

其次,C# 8.0 至少忽略了看起来的语法: https: //dotnetfiddle.net/Mhbqhk

有什么想法可以让第二个发挥作用吗?

c# c#-8.0

1
推荐指数
1
解决办法
3105
查看次数

标签 统计

c# ×1

c#-8.0 ×1

cpu-usage ×1

performance ×1

postgresql ×1

postgresql-13 ×1