Dynamic impact analysis is a fundamental technique for understanding the impact of specific program entities, or changes to them, on the rest of the program for concrete executions. However, existing techniques are either inapplicable or of very limited utility for distributed programs running in multiple concurrent processes. This paper presents DISTIA, a dynamic analysis of distributed systems that predicts impacts propagated both within and across process boundaries by partially ordering distributed method-execution events, inferring causality from the ordered events, and exploiting message-passing semantics. We applied DISTIA to large distributed systems of various architectures and sizes, for which it on average finishes the entire analysis within one minute and safely reduces impact-set sizes by over 43% relative to existing options with run-time overhead less than 8%. Moreover, two case studies initially demonstrated the precision of DISTIA and its utility in distributed system understanding. While conservative thus subject to false positives, DISTIA balances precision and efficiency to offer costeffective options for evolving distributed programs. Socket ssock = null; 3 public S(int port) { ssock = new Socket(port); ssock.accept(); } 4 char getMax(String s) {...} 5 void serve() { String s = ssock.readLine(); 6 char r = getMax(s); ssock.writeChar(r); } 7 public static int main(String[] a) { 8 S s = new S(33); s.serve(); return 0; }} 9 public class C { 10 Socket csock = null; 11 public C(String host,int port) { csock = new Socket(host,port); } 12 void shuffle(String s) {...} 13 char compute(String s) { shuffle(s); csock.writeChars(s); 14 return csock.readChar(); } 15 public static int main(String[] a) { C c = new C('localhost',33); 16 System.out.println( c.compute(a[0]) ); return 0; }}