MyException - 我的异常网
当前位置:我的异常网» 操作系统 » PostgreSQL、Greenplum 日常监控 跟 维护任务

PostgreSQL、Greenplum 日常监控 跟 维护任务

www.MyException.Cn  网友分享于:2013-09-28  浏览:0次
PostgreSQL、Greenplum 日常监控 和 维护任务

原文地址

 

 

标签

 

PostgreSQL , Greenplum , Recommended Monitoring and Maintenance Tasks , 监控 , 维护


背景

Greenplum的日常监控点、评判标准,日常维护任务。

展示图层

由于一台主机可能跑多个实例,建议分层展示。

另外,即使是ON ECS虚拟机(一个虚拟机一个实例一对一的形态)的产品形态,实际上也建议分层展示,以示通用性。

主机级图层

1、全局

2、以集群分组

展示图形

1、饼图(正常、警告、严重错误、不可用,占比,数量)

2、热力图(每台主机一个点,颜色描绘正常、警告、严重错误、不可用)

3、列表(正常、警告、严重错误、不可用倒排,TOP 主机)

实例级图层

1、全局

2、以集群分组

展示图形

1、饼图(正常、警告、严重错误、不可用,占比,数量)

2、热力图(每实例一个点,颜色描绘正常、警告、严重错误、不可用)

3、列表(正常、警告、严重错误、不可用倒排,TOP 实例)

明细图层

全局、分组 -> 主机、实例 -> 主机、数据库实例明细监控指标

全局、分组 -> 主机 -> 实例 -> 数据库实例明细监控指标

数据库状态监控

监控集群的健康状态。

1、列出当前down的segment节点。

检查方法:

连接到postgres数据库,执行:

SELECT * FROM gp_segment_configuration    
WHERE status <> 'u';    

判断方法:

有返回,表示该segment已经down了。

事件级别:

warning。

如果有mirror节点,不影响使用。

重要程度:

重要。

监控频率:

5-10分钟。

处理方法:

1、检查DOWN segment主机是否正常。

2、检查DOWN segment的primary, mirror节点的pg_log日志。找出原因。

3、如果没有异常,使用gprecoverseg把DOWN的节点拉起来。

2、列出当前处于change tracking的segment节点。

检查方法:

连接到postgres数据库,执行:

SELECT * FROM gp_segment_configuration    
WHERE mode = 'c';    

判断方法:

如果有记录返回,表示有处于change tracking的segment。

事件级别:

warning。

重要程度:

重要

监控频率:

5-10分钟。

处理方法:

1、检查DOWN segment主机是否正常。

2、检查DOWN segment的primary, mirror节点的pg_log日志。找出原因。

3、如果没有异常,使用gprecoverseg把DOWN的节点拉起来。

3、列出当前处于re-syncing状态的segment节点。

检查方法:

连接到postgres数据库,执行:

SELECT * FROM gp_segment_configuration    
WHERE mode = 'r';    

需要加入时间条件。判断是否长时间处于r状态。

判断方法:

如果有记录返回,表示有处于re-syncing的segment。

事件级别:

warning。

重要程度:

重要

监控频率:

5-10分钟。

处理方法:

如果节点很长时间处于re-synched状态。检查SEGMENT的primary, mirror节点的pg_log,排查错误。

4、列出当前角色未处于优先角色的节点的segment节点。

检查方法:

连接到postgres数据库,执行:

SELECT * FROM gp_segment_configuration    
WHERE preferred_role <> role;    

判断方法:

如果有记录返回,表示当前集群可能处于not balanced状态。

事件级别:

warning。

重要程度:

重要

监控频率:

5-10分钟。

处理方法:

如果当前集群处于not balanced状态,某个主机的primary节点可能更多,负担较重,影响性能。

建议找到维护窗口,重启数据库集群。

5、检测所有节点是否可达,确保QD(query dispatching)正常。

检查方法:

连接到postgres数据库,执行:

SELECT gp_segment_id, count(*)    
FROM gp_dist_random('pg_class')    
GROUP BY 1;    

判断方法:

正常情况下,每个节点返回一条记录,如果执行失败,表示有不可达的segment,执行SQL是QD阶段会失败。

事件级别:

critical。

重要程度:

严重

监控频率:

5-10分钟。

处理方法:

如果查询失败,表示某些segment节点的QD异常,这是一个罕见错误。需要检查异常节点(不能触及的segments)的硬件、网络是否正常。

6、列出当前异常的master standby节点。

检查方法:

连接到postgres数据库,执行:

SELECT summary_state    
FROM gp_master_mirroring;    

判断方法:

返回Not Synchronized时,表示master standby异常。

事件级别:

warning。

重要程度:

重要。

监控频率:

5-10分钟。

处理方法:

检查master, standby的pg_log,是否有错误日志,针对性修复。

如果没有unexpected错误,并且机器正常。那么使用gpinitstandby修复standby。

GPDB 4.2以及以前的版本,需要重启GPDB集群。

7、列出当前down的segment节点。

检查方法:

连接到postgres数据库,执行:

SELECT procpid, state FROM pg_stat_replication;    

判断方法:

如果state不是'STREAMING',或者没有记录返回,那么说明master standby节点异常。

事件级别:

warning。

重要程度:

重要

监控频率:

5-10分钟。

处理方法:

检查master, master standby节点的pg_log是否有异常日志。

如果没有unexpected错误,并且机器正常。那么使用gpinitstandby修复standby。

GPDB 4.2以及以前的版本,需要重启GPDB集群。

8、检查master节点是否up并正常提供服务。

检查方法:

连接到postgres数据库,执行:

SELECT count(*) FROM gp_segment_configuration;    

判断方法:

QUERY正常返回,表示master节点正常。

事件级别:

critical。

重要程度:

严重

监控频率:

5-10分钟。

处理方法:

如果这个QUERY不能正常执行,说明active master节点可能DOWN了。

重试若干次,如果都异常,关闭active master(一定要确保关闭无误),切换到standby master。

列出master, segment, standby, mirror状态的其他方法

使用命令查询master, segment, standby, mirror状态

1、master和segment状态

gpstate  
  
或  
  
gpstate -s  

2、segment mirror状态

gpstate -m   

3、primary和mirror mapping状态

gpstate -c  

4、master standby状态

gpstate -f  

数据库告警日志监控

1、列出FATAL and ERROR级别的错误日志。

检查方法:

方法1,在安装了gpperfmon组件的情况下

连接到gpperfmon数据库,执行:

SELECT * FROM log_alert_history    
WHERE logseverity in ('FATAL', 'ERROR')    
   AND logtime > (now() - interval '15 minutes');    

方法2,查看所有节点(master, standby master, primary, mirror segments)的pg_log。过滤FATAL and ERROR级别的错误日志。

方法3,查看这些系统视图

                        List of relations    
   Schema   |          Name          | Type |  Owner   | Storage     
------------+------------------------+------+----------+---------    
 gp_toolkit | gp_log_command_timings | view | digoal   | none  -- 统计    
 gp_toolkit | gp_log_database        | view | digoal   | none  -- 这个包含当前数据库日志    
 gp_toolkit | gp_log_master_concise  | view | digoal   | none  -- 统计    
 gp_toolkit | gp_log_system          | view | digoal   | none  -- 这个包含所有日志    
(4 rows)    

实际上gp_log_system是一个command外部表,列出了所有segment, master的csvlog的内容。

View definition:    
 SELECT __gp_log_segment_ext.logtime, __gp_log_segment_ext.loguser, __gp_log_segment_ext.logdatabase, __gp_log_segment_ext.logpid, __gp_log_segment_ext.logthread, __gp_log_segment_ext.loghost, __gp_log_segment_ext.logport, __gp_log_segme    
nt_ext.logsessiontime, __gp_log_segment_ext.logtransaction, __gp_log_segment_ext.logsession, __gp_log_segment_ext.logcmdcount, __gp_log_segment_ext.logsegment, __gp_log_segment_ext.logslice, __gp_log_segment_ext.logdistxact, __gp_log_seg    
ment_ext.loglocalxact, __gp_log_segment_ext.logsubxact, __gp_log_segment_ext.logseverity, __gp_log_segment_ext.logstate, __gp_log_segment_ext.logmessage, __gp_log_segment_ext.logdetail, __gp_log_segment_ext.loghint, __gp_log_segment_ext.    
logquery, __gp_log_segment_ext.logquerypos, __gp_log_segment_ext.logcontext, __gp_log_segment_ext.logdebug, __gp_log_segment_ext.logcursorpos, __gp_log_segment_ext.logfunction, __gp_log_segment_ext.logfile, __gp_log_segment_ext.logline,     
__gp_log_segment_ext.logstack    
   FROM ONLY gp_toolkit.__gp_log_segment_ext    
UNION ALL     
 SELECT __gp_log_master_ext.logtime, __gp_log_master_ext.loguser, __gp_log_master_ext.logdatabase, __gp_log_master_ext.logpid, __gp_log_master_ext.logthread, __gp_log_master_ext.loghost, __gp_log_master_ext.logport, __gp_log_master_ext.l    
ogsessiontime, __gp_log_master_ext.logtransaction, __gp_log_master_ext.logsession, __gp_log_master_ext.logcmdcount, __gp_log_master_ext.logsegment, __gp_log_master_ext.logslice, __gp_log_master_ext.logdistxact, __gp_log_master_ext.logloc    
alxact, __gp_log_master_ext.logsubxact, __gp_log_master_ext.logseverity, __gp_log_master_ext.logstate, __gp_log_master_ext.logmessage, __gp_log_master_ext.logdetail, __gp_log_master_ext.loghint, __gp_log_master_ext.logquery, __gp_log_mas    
ter_ext.logquerypos, __gp_log_master_ext.logcontext, __gp_log_master_ext.logdebug, __gp_log_master_ext.logcursorpos, __gp_log_master_ext.logfunction, __gp_log_master_ext.logfile, __gp_log_master_ext.logline, __gp_log_master_ext.logstack    
   FROM ONLY gp_toolkit.__gp_log_master_ext    
  ORDER BY 1;    
postgres=# \d+ gp_toolkit.__gp_log_segment_ext    
                External table "gp_toolkit.__gp_log_segment_ext"    
     Column     |           Type           | Modifiers | Storage  | Description     
----------------+--------------------------+-----------+----------+-------------    
 logtime        | timestamp with time zone |           | plain    |     
 loguser        | text                     |           | extended |     
 logdatabase    | text                     |           | extended |     
 logpid         | text                     |           | extended |     
 logthread      | text                     |           | extended |     
 loghost        | text                     |           | extended |     
 logport        | text                     |           | extended |     
 logsessiontime | timestamp with time zone |           | plain    |     
 logtransaction | integer                  |           | plain    |     
 logsession     | text                     |           | extended |     
 logcmdcount    | text                     |           | extended |     
 logsegment     | text                     |           | extended |     
 logslice       | text                     |           | extended |     
 logdistxact    | text                     |           | extended |     
 loglocalxact   | text                     |           | extended |     
 logsubxact     | text                     |           | extended |     
 logseverity    | text                     |           | extended |     
 logstate       | text                     |           | extended |     
 logmessage     | text                     |           | extended |     
 logdetail      | text                     |           | extended |     
 loghint        | text                     |           | extended |     
 logquery       | text                     |           | extended |     
 logquerypos    | integer                  |           | plain    |     
 logcontext     | text                     |           | extended |     
 logdebug       | text                     |           | extended |     
 logcursorpos   | integer                  |           | plain    |     
 logfunction    | text                     |           | extended |     
 logfile        | text                     |           | extended |     
 logline        | integer                  |           | plain    |     
 logstack       | text                     |           | extended |     
Type: readable    
Encoding: UTF8    
Format type: csv    
Format options: delimiter ',' null '' escape '"' quote '"'    
Command: cat $GP_SEG_DATADIR/pg_log/*.csv    
Execute on: all segments    
postgres=# \d+ gp_toolkit.__gp_log_master_ext    
                External table "gp_toolkit.__gp_log_master_ext"    
     Column     |           Type           | Modifiers | Storage  | Description     
----------------+--------------------------+-----------+----------+-------------    
 logtime        | timestamp with time zone |           | plain    |     
 loguser        | text                     |           | extended |     
 logdatabase    | text                     |           | extended |     
 logpid         | text                     |           | extended |     
 logthread      | text                     |           | extended |     
 loghost        | text                     |           | extended |     
 logport        | text                     |           | extended |     
 logsessiontime | timestamp with time zone |           | plain    |     
 logtransaction | integer                  |           | plain    |     
 logsession     | text                     |           | extended |     
 logcmdcount    | text                     |           | extended |     
 logsegment     | text                     |           | extended |     
 logslice       | text                     |           | extended |     
 logdistxact    | text                     |           | extended |     
 loglocalxact   | text                     |           | extended |     
 logsubxact     | text                     |           | extended |     
 logseverity    | text                     |           | extended |     
 logstate       | text                     |           | extended |     
 logmessage     | text                     |           | extended |     
 logdetail      | text                     |           | extended |     
 loghint        | text                     |           | extended |     
 logquery       | text                     |           | extended |     
 logquerypos    | integer                  |           | plain    |     
 logcontext     | text                     |           | extended |     
 logdebug       | text                     |           | extended |     
 logcursorpos   | integer                  |           | plain    |     
 logfunction    | text                     |           | extended |     
 logfile        | text                     |           | extended |     
 logline        | integer                  |           | plain    |     
 logstack       | text                     |           | extended |     
Type: readable    
Encoding: UTF8    
Format type: csv    
Format options: delimiter ',' null '' escape '"' quote '"'    
Command: cat $GP_SEG_DATADIR/pg_log/*.csv    
Execute on: master segment    

字段解释

Field Name Data Type Description
event_time timestamp with time zone Time that the log entry was written to the log
user_name varchar(100) The database user name
database_name varchar(100) The database name
process_id varchar(10) The system process ID (prefixed with "p")
thread_id varchar(50) The thread count (prefixed with "th")
remote_host varchar(100) On the master, the hostname/address of the client machine. On the segment, the hostname/address of the master.
remote_port varchar(10) The segment or master port number
session_start_time timestamp with time zone Time session connection was opened
transaction_id int Top-level transaction ID on the master. This ID is the parent of any subtransactions.
gp_session_id text Session identifier number (prefixed with "con")
gp_command_count text The command number within a session (prefixed with "cmd")
gp_segment text The segment content identifier (prefixed with "seg" for primaries or "mir" for mirrors). The master always has a content ID of -1.
slice_id text The slice ID (portion of the query plan being executed)
distr_tranx_id text Distributed transaction ID
local_tranx_id text Local transaction ID
sub_tranx_id text Subtransaction ID
event_severity varchar(10) Values include: LOG, ERROR, FATAL, PANIC, DEBUG1, DEBUG2
sql_state_code varchar(10) SQL state code associated with the log message
event_message text Log or error message text
event_detail text Detail message text associated with an error or warning message
event_hint text Hint message text associated with an error or warning message
internal_query text The internally-generated query text
internal_query_pos int The cursor index into the internally-generated query text
event_context text The context in which this message gets generated
debug_query_string text User-supplied query string with full detail for debugging. This string can be modified for internal use.
error_cursor_pos int The cursor index into the query string
func_name text The function in which this message is generated
file_name text The internal code file where the message originated
file_line int The line of the code file where the message originated
stack_trace text Stack trace text associated with this message

判断方法:

1、排查业务逻辑错误、资源限制错误、数据库内核层面的严重错误。

2、对于业务逻辑错误,建议在QUERY时过滤,避免日志过多。

3、关注资源限制、内核错误。

4、错误代码和解释参考

http://gpdb.docs.pivotal.io/43160/admin_guide/managing/monitor.html

SQL Standard Error Codes

Table 4. SQL Codes

事件级别:

warning。

重要程度:

重要

监控频率:

15分钟。

处理方法:

建立每种严重错误的处理方法。

2、SNMP设置,事件自动通知设置。

相关参数

gp_email_smtp_server    
gp_email_smtp_userid    
gp_email_smtp_password or gp_snmp_monitor_address    
gp_snmp_community    
gp_snmp_use_inform_or_trap    

硬件和操作系统监控

1、检查异常的主机、操作系统。

检查方法:

Set up SNMP or other system check for hardware and OS errors.

监控硬件错误:

检查/var/log/mcelog日志文件的内容,如果有信息,说明该机器出现过硬件错误。

监控dmesg异常,例如Out of memory。

检查/var/log/dmesg日志文件的内容.

判断方法:

判断被检查文件的内容,是否出现过异常。

/var/log/mcelog    
    
/var/log/dmesg    

事件级别:

critical

重要程度:

严重

监控频率:

15分钟。

处理方法:

如果有硬件错误或者不可修复的软件错误,建议更换机器。

添加新机器到集群,使用gprecoverseg重建segment,或者使用gpinitstandby修复standby master。

2、列出磁盘使用率。

检查方法:

du -sh $dir    

SELECT * FROM gp_toolkit.gp_disk_free ;  

判断方法:

数据盘:建议达到80%时warning,90%时critical。

日志、临时文件盘:建议达到60%时warning,80%时critical。

事件级别:

critical

重要程度:

严重

监控频率:

5-30分钟

处理方法:

扩容、清数据、清WAL或临时文件。

3、网络监测。

检查方法:

ifconfig    

判断方法:

ethx: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST>  mtu 1500    
        inet xxx.xxx.xxx.xxx  netmask xxx.xxx.xxx.xxx  broadcast xxx.xxx.xxx.xxx    
        ether xxxxxxxxxxx  txqueuelen 0  (Ethernet)    
        RX packets 611100787  bytes 184118991357 (171.4 GiB)    
        RX errors 0  dropped 489309  overruns 0  frame 0    
        TX packets 580090906  bytes 71626153522 (66.7 GiB)    
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0    

检查droped, errors的数量,如果除以packets比例超过某个阈值,说明丢包或者错误严重。告警。

事件级别:

warning。

重要程度:

重要

监控频率:

小时

处理方法:

Work with network and OS teams to resolve errors.

4、存储硬件错误。

检查方法:

根据RAID卡厂商、SSD厂商提供的检测工具。

smartclt命令。

如果是btrfs, zfs, lvm, md类管理的存储,这些工具也可以检测软raid的健康状态。

检测是否异常。

注意,某些检测可能会导致IO堵塞(虽然很短暂),但是也许会比较严重。建议和厂商确认监测命令的堵塞性。

判断方法:

根据厂商提供的方法。

事件级别:

critical。

重要程度:

严重

监控频率:

5分钟。

处理方法:

对于RAID存储,替换坏盘。

对于非RAID或R10存储,替换主机。

5、列出硬件、操作系统内核的不正确配置。

检查方法:

gpcheck    

判断方法:

根据gpcheck的输出进行判断。

事件级别:

critical

重要程度:

严重

监控频率:

安装集群时测试一次即可。

处理方法:

根据gpdb的推荐,设置正确的配置。

6、检测集群的硬件性能极限。

检查方法:

gpcheckperf    

判断方法:

检查集群的io, 网络的性能,判断是否有性能倾斜。

事件级别:

critical

重要程度:

严重

监控频率:

安装集群时测试一次即可。

处理方法:

建议单机的磁盘读写总带宽、网络带宽匹配。

例如有8块盘,每块盘125MB/s的读写带宽,网卡为10GiB。

磁盘总带宽约1 GB/s,与网卡带宽1.25GB/s匹配。

The cluster may be under-specified if data transfer rates are not similar to the following:

2 GB per second disk read    
1 GB per second disk write    
10 Gigabit per second network read and write    

If transfer rates are lower than expected, consult with your data architect regarding performance expectations.

If the machines on the cluster display an uneven performance profile, work with the system administration team to fix faulty machines.

系统表监控

1、检查master, segment的catalog一致性。

检查方法:

对每一个数据库执行:

gpcheckcat -O    

判断方法:

如果有输出,说明有不一致的catalog。

事件级别:

warning

重要程度:

重要

监控频率:

处理方法:

如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如

repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss    

执行对应的脚本,连接到对应数据库,修复catalog异常。

2、检查持久化表的catalog一致性。

检查方法:

断开所有用户的连接,对每一个数据库执行:

gpcheckcat -R persistent    

判断方法:

如果有输出,说明有不一致的持久化表的catalog。

事件级别:

critical

重要程度:

严重

监控频率:

处理方法:

如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如

repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss    

执行对应的脚本,连接到对应数据库,修复catalog异常。

3、检查pg_class与pg_attribute是否不一致。

检查方法:

断开所有用户的连接,对每一个数据库执行:

gpcheckcat -R pgclass    

判断方法:

如果有输出,说明pg_class与pg_attribute不一致。

事件级别:

warning。

重要程度:

重要

监控频率:

处理方法:

如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如

repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss    

执行对应的脚本,连接到对应数据库,修复catalog异常。

4、检查是否有类似"内存泄露"的临时schema,或者missing的schema定义。

检查方法:

断开所有用户的连接,对每一个数据库执行:

gpcheckcat -R namespace    

判断方法:

如果有输出,说明有类似"内存泄露"的临时schema,或者missing的schema定义。

事件级别:

warning。

重要程度:

重要

监控频率:

处理方法:

如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如

repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss    

执行对应的脚本,连接到对应数据库,修复catalog异常。

5、检查随机分布策略的表的约束是否正常。

检查方法:

断开所有用户的连接,对每一个数据库执行:

gpcheckcat -R distribution_policy    

判断方法:

如果有输出,说明有随机分布策略的表的约束是否正常。

事件级别:

warning。

重要程度:

重要

监控频率:

处理方法:

如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如

repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss    

执行对应的脚本,连接到对应数据库,修复。

6、检查是否有对象依赖不存在对象。

检查方法:

断开所有用户的连接,对每一个数据库执行:

gpcheckcat -R dependency    

判断方法:

如果有输出,说明有对象依赖不存在对象。

事件级别:

warning。

重要程度:

重要

监控频率:

处理方法:

如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如

repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss    

执行对应的脚本,连接到对应数据库,修复。

数据维护任务

1、检查丢失统计信息的表。

检查方法:

连接到每个数据库,执行

SELECT * FROM gp_toolkit.gp_stats_missing;    

判断方法:

如果有返回,表示对应的表没有收集统计信息。

事件级别:

warning

重要程度:

重要

监控频率:

处理方法:

analyze table;    

2、检查表、索引膨胀、deadtuple比例。

检查方法:

连接到每个数据库,执行

analyze;      

然后执行

SELECT * FROM gp_toolkit.gp_bloat_diag;    

以上操作查询的是膨胀比较厉害的表,下面这个查询是膨胀明细

select * from gp_toolkit.gp_bloat_expected_pages ;      

详见

《如何检测、清理Greenplum垃圾 - 阿里云HybridDB for PG最佳实践》

判断方法:

如果gp_bloat_diag有返回,表示某些表膨胀很严重。

事件级别:

warning

重要程度:

重要

监控频率:

周或月

处理方法:

在DOWNTIME(维护窗口)执行以下SQL之一,回收空间。

以下SQL会申请排它锁,堵塞增删改查。谨慎选择时间操作。

-- 不重建索引    
    
vacuum full table;    
    
或使用原分布方法redistribute table    
    
-- 会重建索引    
    
alter table <table_name> set with (reorganize=true) distributed randomly;      
      
或      
      
alter table <table_name> set with (reorganize=true) distributed by (<column_names1>,<column_names2>....)      

为了防止膨胀,应该定期执行VACUUM(VACUUM不申请排他锁),不影响DML和查询。

 

原文地址

文章评论

如何成为一名黑客
如何成为一名黑客
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
我的丈夫是个程序员
我的丈夫是个程序员
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
为什么程序员都是夜猫子
为什么程序员都是夜猫子
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员必看的十大电影
程序员必看的十大电影
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员应该关注的一些事儿
程序员应该关注的一些事儿
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
中美印日四国程序员比较
中美印日四国程序员比较
漫画:程序员的工作
漫画:程序员的工作
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员都该阅读的书
程序员都该阅读的书
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
我是如何打败拖延症的
我是如何打败拖延症的
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
老程序员的下场
老程序员的下场
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员的鄙视链
程序员的鄙视链
程序员和编码员之间的区别
程序员和编码员之间的区别
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
鲜为人知的编程真相
鲜为人知的编程真相
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
一个程序员的时间管理
一个程序员的时间管理
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
Java程序员必看电影
Java程序员必看电影
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
旅行,写作,编程
旅行,写作,编程
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
10个调试和排错的小建议
10个调试和排错的小建议
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
那些争议最大的编程观点
那些争议最大的编程观点
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有