幽谷奇峰 | 燕雀鸣幽谷,鸿鹄掠奇峰

解决NetworkManager大幅占用CPU的问题


系统环境:台式机,Ubuntu 12.04 64位桌面版,网卡eth0闲置,平时使用网卡eth1.

网络环境:通过DHCP动态获取ipv4地址,自动获取ipv6地址。

每次打开Transmission通过ipv6下载PT时,进程network-manager的CPU占用率都会飙到百分之九十多。

我的解决方法就是:放弃采用NetworkManager来管理网络设置,而使用传统的/etc/network/interfaces文件来管理网络设置。实际上,服务器版的Linux系统都是采用这种方式的,NetworkManager只有桌面版的Ubuntu系统才有。

第一步:禁用NetworkManager

编辑/etc/NetworkManager/NetworkManager.conf

1
$ sudo vim /etc/NetworkManager/NetworkManager.conf

managed=true改为managed=false,然后重启NetworkManager服务

1
$ sudo service network-manager restart

如果我们将managed设为true时,NetworkManager会接管所有网路设备的设定,而忽略/etc/network/interfaces的内容。

第二步:修改/etc/network/interfaces

此文件原始状态只有以下行:

1
2
3
# /etc/network/interfaces
auto lo
iface lo inet loopback

关于lo的这两行设定是必要的,请勿删除。删掉的话,系统将不具备 127.0.0.1 (localhost) 的网路介面。

挂起网卡eth0:

1
allow-hotplug eth0

动态获取ipv4地址:

1
2
auto eth1
iface eth1 inet dhcp

自动获取ipv6地址的方式:

1
iface eth1 inet6 auto

采用静态ipv6地址的方式:

1
2
3
4
iface eth1 inet6 static
    address your_ipv6_address
    netmask 64
    up route -A inet6 add default gw your_ipv6_gateway dev $IFACE

每次修改过interfaces文件,都要运行以下命令重载设置才能生效。

1
$ sudo service networking restart

此后,NetworkManager不会再占用CPU资源了。

Privacy Extension

Ubuntu默认对ipv6启用了privacy extension.

1
$ sudo vim /etc/sysctl.d/10-ipv6-privacy.conf

在这个文件中,你会看到下面两行:

1
2
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2

看看你的ipv6地址,你会发现一些有趣的东西。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ ip addr show
1: lo:  mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state UP ql en 1000
    link/ether 00:05:06:07:08:09 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 198.168.1.255 scope global eth0
    inet6 2789:1234:cdef:9876:395e:c9fd:78b4:d863/64 scope global temporary dynamic
       valid_lft 604349sec preferred_lft 85349sec
    inet6 2789:1234:cdef:9876:205:06ff:fe07:0809/64 scope global dynamic
       valid_lft 2591921sec preferred_lft 604721sec
    inet6 fe80::205:06ff:fe07:0809/64 scope link
       valid_lft forever preferred_lft forever

对于网卡eth0,你会发现有两个scope global的ipv6地址:"scope global temporary dynamic" 和 "scope global dynamic".

这两个地址都是有生命期的,在"preferred_lft"这么多秒之后,它们就会被新的地址所取代。

如果,我们在文件/etc/sysctl.d/10-ipv6-privacy.conf中取值2,那么那个"temporary"地址就会被用于对外连接。如果取1,就不会;如果取0,就完全禁用privacy extension.

每次修改完此文件,需运行以下命令使设置生效:

1
$ sudo service procps restart

此命令如果不起作用,可试试

1
$ sudo sysctl -p

禁用ipv6

编辑以下文件

1
$ sudo vim /etc/sysctl.conf

添加以下三行

1
2
3
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

重启procps服务

1
2
$ sudo service procps restart
$ sudo sysctl -p

如果,还不起作用,可能就要重启系统了。

参考资料

  1. IPv6 in Ubuntu 12.04

本作品由 Yysfire 创作,采用知识共享许可协议进行许可。转载时请在显著位置标明本文永久链接:
http://yysfire.github.io/linux/networkmanager-occupy-cpu-substantially.html


相关文章


最后修改
2012-10-07 19:47
发表时间
2012-10-07 16:50
本文标签
interfaces 1 IPv6 1 NetworkManager 1 Ubuntu 9
关注我

侧栏导航